在 Bash 腳本中重新命名 + 移動嵌套文件

在 Bash 腳本中重新命名 + 移動嵌套文件

我有一個目錄users,其中充滿了為每個用戶命名的資料夾。在這些文件夾中,有一個名為的文件userinfo.csv,我想將其從文件夾中取出並放入users.由於使用者資料夾中的每個檔案都稱為 userInfo,因此我想將其重新命名以包含該資料夾中的使用者名稱。我嘗試了以下方法,但它不起作用,因為其中的用戶名$dir是完整目錄。我並不熱衷於將其重命名為用戶名,我只需要重命名它,這樣當它移入時users我就不會只剩下一個文件和一堆錯誤。

我該如何改進這個?

# for every subdirectory, copy userinfo.csv to /users and rename to avoid confusion/errors
for dir in /path/to/users/*/; do
    (
        cd "$dir" && cp userinfo.csv _$("dir").csv && cp _$("dir").csv /path/to/users/
    )
done

答案1

如果您不需要最終檔案名稱中的使用者名,則

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/userinfo-$RANDOM.csv
done

適合您的用例嗎?

如果沒有,也可以使用bash的參數替換:

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/${i//\/-}
done

這將替換變數中的所有/內容(路徑+檔案名稱)。所以你最終會得到,例如:-$i

/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv

答案2

for i in $(ls -1 /path/to/users/); do
    mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done

userinfo.csv假設位置是,這將會起作用/path/to/users/$user/userinfo.csv。如果/path/to/users/包含沒有文件userinfo.csv或只有文件的資料夾,mv則不會執行任何操作,因此可以忽略。

在這種情況下,將包含文件或資料夾$i中每個項目的名稱。/path/to/users/

相關內容