Mv

需要遍歷文件夾並將文件移動到不同的目錄?

  • March 13, 2018

我在要移動到不同目錄的子目錄中有一堆文件。

這些目錄組織在一個父目錄中,如下所示:Apr1995 Apr1996 Aug1995 等…(月份和年份)

例如 /Files/Apr1995。

這些文件的格式如下 1995___.info 或 1995___.dat

我想進入每個子目錄並將文件移動到不同的目錄,其中子目錄按年份分隔,然後格式化。像這樣的東西:

OtherFiles/1995/info、OtherFiles/1995/dat、OtherFiles/1996/info 等。

1995 目錄將包含名為 info 和 dat 的子目錄

最後,我想要這個組織,例如:

桌面/文件/Apr1995/1995__.info,

桌面/文件/Apr1995/1995__.dat,

桌面/其他文件/1995/資訊,

Desktop/OtherFiles/1995/dat 等

我已經嘗試了很多選項,比如幾個單襯裡:

for d in ./*/ ; do (cd "$d" && mv 1995*.info /1995/info); done

或者

find ./ -type f -execdir mv 1995*.info /1995/info {} \;

我只是收到 mv 錯誤,或者它無法辨識它們是那些文件。

shell 腳本也可以提供幫助。

對於看起來相對容易的事情,我有點不知所措。任何幫助,將不勝感激。

編輯:希望添加的資訊可以提供幫助

您的第二個命令將起作用,但您沒有指定文件名。如果您想移動與1995_.info和/或模式匹配的所有文件1995_.dat

find ./ -type f -name 1995*.info -exec mv {} /1995/info \;

find ./ -type f -name 1995*.dat -exec mv {} /1995/dat \;

如果您想在一個命令中完成所有年份:

for y in {1995..1999}; do $(find Years -type f -name $y*.info -exec mv {} '/'$y'/info' \;); done

for y in {1995..1999}; do $(find Years -type f -name $y*.dat -exec mv {} '/'$y'/dat' \;); done

這將遍歷每年的目錄並找到文件名並將它們移動到它們的年度目錄。

旁注:我在 CentOS 7.4 中測試並確認了這一點,但根據環境,您可能需要轉義,*以便在其前面添加反斜杠:\*

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