
我有 2500 個檔案名稱 LposK.dat,L 範圍從 1 到 10,K 範圍從 0.00 到 49.80。我需要將具有相同 K 的那些移動到資料夾中。我設法使用以下方法來做到這一點:
find . -name '*posK.dat' -exec mv {} ~/destination/K \;
但我必須手動更改 K 的值並重複多次。我想知道是否有任何方法可以在 find 和 mv 命令中使用循環索引(例如:for 循環),以便我可以編寫腳本來執行此操作。
答案1
要取得K
from LposK.dat
,如果該字串在 中$name
,我們可以這樣做
k=${name%.dat} # remove ".dat" suffix
k=${k##*pos} # remove everything up to end of (the last) "pos"
即使$name
是像這樣的路徑名some/path/LposK.dat
(即使some/path
包含字串pos
),這也可以工作,當我們稍後將其插入到find
.
移動一個檔案:
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest" # only move if mkdir did not fail
和find
:
find . -type f -name '*pos*.dat' -exec sh -c '
for name do
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done' sh {} +
這將為內部sh -c
腳本提供許多路徑名作為參數,並且腳本將迭代這些路徑名,將每個路徑移動到$HOME/destination
.
有關的:
如果您的檔案位於單一子目錄(目前目錄)中,那麼您可以更輕鬆地執行此操作,而無需find
:
for name in ./*pos*.dat; do
[ ! -f "$name" ] && continue # skip non-regular files
k=${name%.dat}
k=${k##*pos}
dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"
done