【问题标题】:combine linux `find` and `cp` with output if file is not found如果找不到文件,则将 linux `find` 和 `cp` 与输出结合起来
【发布时间】:2021-07-11 13:57:23
【问题描述】:

你好堆栈溢出-

我想用一个输入文本文件(每个文件一行来查找)做两件事:将找到的文件复制到不同的目录,并提供一条消息是否找不到文件。该消息不必专门说明未找到文件;它还可以包括找到的文件的位置,如下面显示的输出。我无法组合下面的两个命令。这可能吗?我确信有其他解决方案,并且对这些方案持开放态度

#如果找不到文件或找到文件的位置,将告诉您: 命令:

for i in $(cat toGet.txt); do find . -name "$i" | grep . || echo "$i - file not found" ; done

输出:

  • file1_L001_R*_001.fastq.gz - 找不到文件
  • ./file2_S13_L001_R2_001.fastq.gz
  • ./file2_S13_L001_R1_001.fastq.gz
  • file3_L001_R*_001.fastq.gz - 找不到文件

#将找到的文件复制到新目录

for i in $(cat toGet.txt); do find . -name "$i" -exec cp {} /path/to/directory \; ; done

任何建议

【问题讨论】:

  • 如果任何文件名的名称中有空格,for i in $(cat toGet.txt); 将不起作用。
  • 谢谢;我不担心空格,因为文件名中没有空格
  • 预防它是一个好习惯,以防万一。

标签: linux bash shell copy find


【解决方案1】:

编写一个脚本,接收要复制到其标准输入的文件名。如果输入为空,则报告未找到该文件,否则将其复制。然后将find 输出通过管道传递给它。

copy_to.sh:

#!/bin/sh

looking_for=$1
dest_dir=$2
found=$(cat)
if [ -z "$found" ]
then echo "$looking_for - file not found"
else cp "$found" "$dest_dir"
while read -r i; do
    find . -name "$i" | ./copy_to.sh "$i" /path/to/directory
done < toGet.txt

【讨论】:

  • 太棒了,谢谢!但我需要将 fi 添加到 copy_to.sh 脚本的末尾;我无法添加到您的答案中,因为“编辑需要有 6 个字符”:)
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 2018-11-29
  • 2014-02-11
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多