Bash
如何在文件夾中查找所有匹配(或不匹配)特定模式的文件?
如何找到文件夾中的所有文件及其以 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
我建議您在實際執行它之前添加
mkdir
andmv
withecho
,以確保它符合您的預期。要否定這 3 位數字,只需放置 do
! -regex
代替。這是一個更簡單的方法,它依賴於 rsync。但是,它確實會呼叫
rsync
它找到的每個文件,因此絕對不是很有效。find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct