linux cp命令 通配符,关于shell:cp和mv中的Linux通配符用法

我正在编写一个脚本来处理20个文件。 它们全部位于不同的目录中。 我有部分文件名。

在日志目录中,File1_Date_time.err更改为File1__Date_time_orig.err

cd ../scripts/

sh File.sh

File1目录为/data/data1directory/Sample_File1/logs/File1_Data_time.err

File2目录为/data/data2directory/Sample_File2/logs/File2_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

运行时,我尝试过。

./runrunrun.sh File1

。 runrunrun.sh File1

sh runrunrun.sh File1

mv:无法移动/data/data1directory/Sample_File1/logs/File1_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err:无此类文件或目录

cp也得到了类似的反馈

我做对了吗?

谢谢!

mv,cp等。如果这些通配符具有任何有效的扩展名,则不会通过通配符。 相反,它们传递了通过运行这些扩展创建的原义文件名。 因此,由于他们不知道输入名称中使用的文字通配符,因此他们可能无法将输入名称中的*映射到输出名称中的*。

如果您想编写重命名工具,那么一个不错的起点是BashFAQ#30:mywiki.wooledge.org/BashFAQ/030

相关:stackoverflow.com/questions/20629302/

顺便说一句,sh foo.sh非常危险,除非您完全确定该脚本以#!binsh而不是#!binbash,#!binksh,#!binzsh等开头; 否则,可能使用了错误的解释器。

让我们谈论通配符如何工作一分钟。

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

这使用了参数扩展来去除旧名称的末尾,然后再添加新名称名称。

在想要对通配符(或更复杂的)文件名匹配执行操作的简单情况下,可以非常简洁地使用find命令。以下技术可以用于内存...几乎!

通过让find命令在找到的每个文件名上运行另一个命令来起作用。您可以使用echo代替mv空运行此示例。

如果我们想将当前目录中所有以" report"开头的文件移动到另一个并行目录" reports":

find . -name"report*.*" -exec mv '{}' ../reports/ \;

通配符字符串必须用引号引起来,标记"找到"的文件名的{}必须用引号引起来,并且必须转义最后的分号-所有这些都是由于对这些字符进行了Bash / shell处理。

请查看find的手册页以了解更多用途:https://linux.die.net/man/1/find

尝试这个:

更改这些:

zc_cd_delim_01.csv

zc_cd_delim_04.csv

这些:

zc_cd_delim_113_01.csv

zc_cd_delim_113_04.csv

命令行:

for f in zc_cd_delim_??.csv; do var1=${f%%??.*};

mv $f"${var1}113_${f#$var1}";

done

mv"$f"相反,如果??与带有空格的文件名匹配,或者IFS包含在名称中找到的字符(即_),则行为可能令人惊讶。

顺便说一句,我不太清楚这如何适用于当前的问题-c_cd_delim_??.csv在我看来并不像OP所使用的一种模式作为他们想要匹配的示例。 您介意进行编辑以使该问题的适用性更加清楚吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值