cp和mv中的linux通配符用法
我正在编写一个脚本来处理20个文件.它们都位于不同的目录中.我有部分文件名.
>在日志目录中,File1_Date_time.err更改为File1__Date_time_orig.err File1目录是/data/data1directory/Sample_File1/logs/File1_Data_time.err 我的脚本看起来像这样. (runrunrun.sh) #!/bin/bash INPUT=$1 mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh sh /data/*/Sample_*/scripts/*_orig.sh 在运行时,我试过了. mv:无法移动/data/data1directory/Sample_File1/logs/File1_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err:没有这样的文件或目录 我做得对吗? 谢谢! 解决方法
我们来谈谈通配符如何工作一分钟.
cp *.txt foo 如果存在与该glob匹配的任何文件,则实际上不会使用参数* .txt调用cp.相反,它运行如下: cp a.txt b.txt c.txt foo 同样,像 mv *.txt *.old …不可能知道该怎么做,因为当它被调用时,它看到的是: mv a.txt b.txt c.txt *.old 或者更糟糕的是,如果您已经有一个名为z.old的文件,它会看到: mv a.txt b.txt c.txt z.old 因此,您需要使用不同的工具.考虑: # REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err for f in /data/*/Sample_*/logs/*_Data_time.err; do mv "$f" "${f%_Data_time.err}_Data_time_orig.err" done # REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh for f in /data/*/Sample_*/scripts/*.sh; do cp "$f" "${f%.sh}_orig.sh" done # REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh for f in /data/*/Sample_*/scripts/*_orig.sh; do if [[ -e "$f" ]]; then # honor the script's shebang and let it choose an interpreter to use "$f" else # script is not executable,assume POSIX sh (not bash,ksh,etc) sh "$f" fi done 在添加新名称之前,它使用parameter expansion去除旧名称的尾部. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |