gpt4 book ai didi

cp 和 mv 中的 linux 通配符用法

转载 作者:IT王子 更新时间:2023-10-29 00:43:22 24 4
gpt4 key购买 nike

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

  1. 在log目录下,File1_Date_time.err改为File1__Date_time_orig.err
  2. cd ../脚本/
  3. sh 文件.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 文件1
. runrunrun.sh 文件1
sh runrunrun.sh File1

mv: 无法移动 /data/data1directory/Sample_File1/logs/File1_Data_time.err/data/*/Sample_*/logs/*_Data_time_orig.err: 没有这样的文件或目录cp也得到了类似的反馈

我做的对吗?

谢谢!

最佳答案

让我们花点时间谈谈通配符的工作原理。

cp *.txt foo

实际上并没有调用带有参数 *.txtcp,如果存在与该 glob 匹配的任何文件。相反,它运行如下:

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在添加新名称之前去除旧名称的尾端。

关于cp 和 mv 中的 linux 通配符用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com