使用 xargs 查找和复制在脚本中不起作用

使用 xargs 查找和复制在脚本中不起作用

我需要从一个巨大的目录中找到三个文件并将它们复制到另一个目录。

这就是我所做的:

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 $bdirecho "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.

相关内容