在 bash 中,我有一个脚本,它使用 while 循环将某个文件夹中的文件复制到各种不同的目录。复制每个文件后,我写了
mv $dir/$file $dir/_$file
在文件的前缀中使用来_
标记它已被复制。 ($dir
是从其中复制文件的位置。)在循环结束时,脚本列出未标记的文件以显示哪些文件尚未复制。
我遇到了一个小冲突,某些文件多次复制到不同的目录,但无法再次复制该文件,因为它的名称已更改。
本来想用if [ $file -eq $dir/_$file ]
但是效果不好。检查给"_$file"
定目录的简单方法是什么"$file"
?
如果有更好的方法来完成这一切,那就太好了。
答案1
给定一个扩展为的文件$filename
:
if [[ -f "dir/_${filename}" ]]; then
echo "The prefixed copy exists."
else
echo "The prefixed copy does not exist."
fi
答案2
我看到了答案,但我也提出了我的答案。也许这对某人会有帮助。
#!/bin/sh
filename="file"
directory="bash_test"
if [ "$filename" = "$(basename $directory/_$filename|tr -d ^_)" ]
then
echo "Prefix exists."
else
echo "Prefix not exists."
fi
答案3
我能够用这个来弄清楚:
[ -f $dir/_$file ]
或者
if [ -f $dir/_$file ]; then
简单地检查具有特定前缀的文件是否存在。很简单,我让它变得比需要的更困难。
有时,我不知道在引用变量时是否要使用引号。
答案4
测试-eq
将失败,因为参数不是整数(-eq
测试两个整数的算术等价性)。
您可能想要做的是检查带下划线的名称是否已被其他文件占用,而不仅仅是常规文件。
你可以这样做
if [ -e "$dir/_$file" ]; then
printf 'The name "%s" already exists in directory %s\n' "_$file" "$dir"
fi
您需要使用双引号,$dir/_$file
如我上面所示,或者使用双引号"$dir"/_"$file"
(只要和都$dir
被$file
引用)。这样可以避免对变量值进行分词,从而避免在其中一个或两个变量由于某种原因包含空格字符时出现运行时语法错误。它还可以避免在目录和文件名上调用文件名生成(通配符)。
我使用了这个-e
测试,因为我假设你也想知道是否有,例如,目录目录中带下划线的名称$dir
。