gpt4 book ai didi

linux - Bash:如何拖尾然后复制多个文件(例如使用 xargs)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:33 28 4
gpt4 key购买 nike

我一直在尝试 xargs 和管道的各种组合,但我就是无法获得正确的结果。以前的问题并没有完全涵盖我想做的事情:

  • 我在某处有一个源目录,比如/foo/source,其中混合了不同的文件
  • 我只想将在源中找到的 csv 文件复制到不同的目的地,比如/foo/dest
  • 但我同时还需要删除 232 个标题行(例如使用尾部)

我发现我需要将 find 的结果通过管道传输到 xargs,然后 xargs 可以对每个查找结果运行命令。但我正在努力跟踪然后复制。如果我将 tail 通过管道传输到 cp,cp 似乎没有收到文件(缺少文件操作数)。以下是我迄今为止尝试过的一些示例:

find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 | cp -t /foo/dest'

cp: missing file operand

find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 {} | cp -t /foo/dest'

结果:

cp: failed to access '/foo/dest': No such file or directory ...

find /foo/source -name "*.csv" | xargs -I '{}' sh -c 'tail -n +232 {} > /foo/dest/{}'

sh: /foo/dest/foo/source/0001.csv: No such file or directory ...

如有任何指点,我们将不胜感激!

谢谢

最佳答案

只需使用 findexec 并将文件名复制到变量中:

find your_dir -name "*.csv" -exec sh -c 'f="$1"; tail -n +5 "$f" > dest_dir/$(basename "$f")' -- {} \;

请参阅 f={} 使 $f 保存文件名和完整路径。然后,将 tail 的输出重定向到文件中,从中剥离路径。

或者,基于 Random832's suggestion下面的评论(谢谢!):

find your_dir -name "*.csv" -exec sh -c 'tail -n +5 "$1" > dest_dir/$(basename "$1")' -- {} \;

关于linux - Bash:如何拖尾然后复制多个文件(例如使用 xargs)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39350420/

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