如何将具有多种模式的文件移动到特定目录,bash?

如何将具有多种模式的文件移动到特定目录,bash?

需要移动具有多个已定义模式的文件,例如:

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 元字符(它们不完全匹配它们本身 - 通常是不规则的空格或通配符表达式)。

相关内容