Find

如何將所有文件移動(或複制)到具有相同文件名前綴的目錄中?

  • February 7, 2012

使用 Bash

所以假設我有一堆文件隨機放置在父目錄~/src中,我想抓取所有匹配某個後綴的文件並將它們移動(或複制)到一個~/dist目錄中。

為此,我們假設所有文件名都具有以下命名約定:

<filename_prefix>.<filename_suffix>

我發現這是一種快速獲取具有特定內容的所有文件filename_suffix並將它們放入 dist 文件夾的方法:

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

現在更進一步……在這種情況下filename,如何使用 find 的輸出並使用filename_prefix生成同名目錄,~/dist然後將具有該前綴的所有文件移動(或複制)到適當的目錄中?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

本質上,我如何更改上述命令(或者可能使用另一個命令)來創建這樣的結構

(輸出)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

從這樣的目錄樹?

(輸入)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

find在這種情況下,告訴該怎麼做將是地獄。

更好地使用外殼:

for i in **/*.{xrt,ini,moo}; do
 FILE=$(basename "$i")
 DIR=~/dst/${FILE%.*}
 echo mkdir -p -- "$DIR"
 echo mv -i -t "$DIR" -- "$i"
done

用於shopt -s globstar使**glob 工作(或使用 zsh!)。echo如果命令列印出您想要的內容,請稍後刪除s 。

作弊查找命令行:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

實際上是在 find LOL 中呼叫 bash 腳本的一種解決方法。

=P

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