需要移动具有多个已定义模式的文件,例如:
Z_*ana_bwk_na_N*.png
Z_*ana_bwk_dwda*.png
Z_*ana_bwkman_dwdna*
Z_*ana_bwkman_dwdc*
Z_*EDZW*_nwv01*_p00_na_N*WV11.png
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
Z_*nwv01*_hsy_NA*.png
Z_*EDZW_*_htp_na_N_*_WV11SW.png
Z_*_rft_na_*.png
Z_*_r12*
从一个定义的文件夹到另一个。
如何才能以最经济的方式做到这一点?在脚本中,从 cron 运行?
这些模式可以在同一脚本中更好地定义,或者从包含它们的单独文本文件中获取吗?
答案1
这很简单:
mv Z_*ana_bwk_na_N*.png Z_*ana_bwk_dwda*.png Z_*ana_bwkman_dwdna* -t /your/directory/
如果您希望文件输入更加优雅:
PATTERNS=`cat input.txt | paste -sd " " - ` && mv $PATTERNS -t /your/directory/
答案2
假设你的模式在一个名为patterns的文件中
mapfile -t arr < patterns && mv -t destination "${arr[@]}"
答案3
最有效但可能最不清晰的方法是在一个大的快乐mv
命令中枚举所有内容。
mv Z_*ana_bwk_na_N*.png \
Z_*ana_bwk_dwda*.png \
Z_*ana_bwkman_dwdna* \
Z_*ana_bwkman_dwdc* \
Z_*EDZW*_nwv01*_p00_na_N*WV11.png \
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png \
Z_*nwv01*_hsy_NA*.png \
Z_*EDZW_*_htp_na_N_*_WV11SW.png \
Z_*_rft_na_*.png \
Z_*_r12* \
destination
如果您想将其拆分(可能是因为您得到“命令行太长”),您可以使用此处的文档。
while read files; do
mv $files dest
done <<____
Z_*ana_bwk_na_N*.png
Z_*ana_bwk_dwda*.png
Z_*ana_bwkman_dwdna*
Z_*ana_bwkman_dwdc*
Z_*EDZW*_nwv01*_p00_na_N*WV11.png
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
Z_*nwv01*_hsy_NA*.png
Z_*EDZW_*_htp_na_N_*_WV11SW.png
Z_*_rft_na_*.png
Z_*_r12*
____
如果您想参数化目的地,您也可以这样做。
while read destination files; do
mv $files "$destination"
done <<____
here Z_*ana_bwk_na_N*.png
here Z_*ana_bwk_dwda*.png
here Z_*ana_bwkman_dwdna*
there Z_*ana_bwkman_dwdc*
there Z_*EDZW*_nwv01*_p00_na_N*WV11.png
everywhere Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
here Z_*nwv01*_hsy_NA*.png
elsewhere Z_*EDZW_*_htp_na_N_*_WV11SW.png
there Z_*_rft_na_*.png
anywhere Z_*_r12*
____
有点令人困惑的是,这里文档中的通配符将被 shell 扩展在循环运行之前。 因为我们需要不加引号的内部循环,所以扩展的文件名不能包含任何 shell 元字符(它们不完全匹配它们本身 - 通常是不规则的空格或通配符表达式)。