我需要从一个巨大的目录中找到三个文件并将它们复制到另一个目录。
这就是我所做的:
find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir
该文件a1
将复制到目标位置,但其他文件不会复制到目标位置。这是我的脚本:
#!/bin/bash
date=$(date)
day=$(date +"%u")
adir=/x/y
bdir=/a/b
{
if [ "$day" == "5" ] ; then
find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8 | xargs cp -t $bdir
else
echo "failed"
fi
}
我在脚本中运行它,光标没有返回到终端。有什么办法可以让它发挥作用吗?
答案1
尝试卸下括号。这个命令直接在终端和 bash shell 中为我工作(将 cp 更改为“文件”以检查它是否有效..):
find . -type f -name "a4*" -o -name "d1*" -o -name "f2*" -mtime -8 | xargs file
您还可以尝试 for 循环,这可能会给您更多的空间(循环)来执行操作。更改find
行
for a_file in `find $adir -type f \( -name "a1*" -o -name "a2*" -o -name "a3*" \) -mtime -8`
do
cp -t $a_file $bdir
done
您可以删除-mtime -8
并更改cp -t $a $bdir
为echo "The file is: " $a_file
进行测试......
答案2
正如所讨论的,您的脚本在语法和语法上看起来都是正确的,因此脚本本身之外一定有一些东西导致它按照它的方式运行。
话虽如此,我可以给你我自己对剧本的看法。这是我编写的等效内容的方式:
#!/bin/sh
day=$(date +'%u')
adir='/x/y'
bdir='/a/b'
case "$day" in
5) find "$adir" -type f -mtime -8 -name 'a[123]*' -exec cp {} "$bdir"/ ';'
;;
*) printf 'Error: Unhandled day "%s"\n' "$day" >&2
exit 1
esac
这只是利用了这样一个事实:您想要匹配的各种名称可以通过单个文件名通配模式进行匹配。它也不依赖于 GNUcp
及其-t
选项(摆脱了xargs
)。而且由于它没有使用任何“bashisms”,因此它也可以由 来解释/bin/sh
。
比case ... esac
一堆if ... then ... elif
.