Linux

根據 csv 列表將具有匹配前綴的所有文件移動到文件夾

  • May 11, 2018

我有數千個帶有各種前綴的文件,這些前綴被分組在一個 csv 列表中。現在我想根據他們的列表將它們全部移動到他們的文件夾中。

例如:文件 A1B1C1_{…}.png、A1B2C2_{…}.png、A1B1C3_{…}.png 等 CSV 列表:

Name   Group
A1B1C1 John
A2B1C1 John
A1B2C2 Denver
A1B1C3 Nick

現在我想將所有帶有 A1B1C1_ 和 A2B1C1_ 前綴的文件移動到 John 文件夾,將 A1B2C2_ 前綴移動到 Denver 文件夾,將 A1B1C3_ 前綴移動到 Nick 文件夾。

我在考慮

for group in *_*.csv; 
do {...}

但我不確定如何從 csv 文件中讀取列表以及從列表語法中移動文件。

我正在開發 CentOS,非常感謝。

awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
   find . -type f -name "$prefix*" -exec sh -c '
       group="$1"; shift
       mkdir -p "$group"
       for name do echo mv "$name" "$group"; done' sh "$group" {} +
done

這將用於awk提供帶有前綴和組名的 while 循環(跳過列表文件的文件頭)。這假定所有前綴和組名中都沒有空格或製表符。

while 循環呼叫find以查找目前目錄中或目前目錄下的所有正常文件,其名稱以給定前綴開頭。對於所有此類文件,呼叫以下簡短的 shell 腳本:

group="$1"
shift

mkdir -p "$group"
for name do
   echo mv "$name" "$group"
done

該腳本期望組名是命令行上的第一個參數,其餘參數是要移動到該組目錄的文件的路徑名。

如果目前工作目錄不存在,該腳本會在目前工作目錄中創建一個組目錄,然後遍歷給定的路徑名,將每個文件移動到位。不檢查文件是否被覆蓋。

echo防止mv實際執行。執行程式碼以echo確保其正常工作,然後刪除echo.

引用自:https://unix.stackexchange.com/questions/443125