Bash

如何在文件夾中查找所有匹配(或不匹配)特定模式的文件?

  • September 14, 2015

如何找到文件夾中的所有文件及其以 3 位數字結尾的子文件夾並將它們移動到新位置,同時保持目錄結構?

或者,我怎樣才能找到名稱不以三位數結尾的所有文件?

更清潔的解決方案,基於@don_crissti 連結的答案。(Rsync 過濾器:僅複製一種模式

rsync -av --remove-source-files --include='*[0-9][0-9][0-9]' --include='*/' --exclude '*' /tmp/oldstruct/ /tmp/newstruct/

和否定:

rsync -av --remove-source-files --exclude='*[0-9][0-9][0-9]' /tmp/oldstruct /tmp/newstruct/

原答案:

這應該這樣做。它會在你的結構中找到任何cd以 3 位數字結尾的文件,在 中創建一個目標文件夾/tmp/newstruct,然後移動文件。

cd /tmp/oldstruct
find ./ -type f -regextype posix-basic -regex '.*[0-9]\\{3\\}' | 
 while read i; do 
   dest=/tmp/newstruct/$(dirname $i)
   mkdir -vp $dest
   mv -v $i $dest
 done

我建議您在實際執行它之前添加mkdirand mvwith echo,以確保它符合您的預期。

要否定這 3 位數字,只需放置 do! -regex代替。


這是一個更簡單的方法,它依賴於 rsync。但是,它確實會呼叫rsync它找到的每個文件,因此絕對不是很有效。

find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct

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