【问题标题】:find and copy from filelist with spaces in it从包含空格的文件列表中查找并复制
【发布时间】:2019-12-18 09:22:28
【问题描述】:

我有一个由换行符分隔的 pdf 文件列表。 (文件名包含很多空格...)

如果我这样做

cat file.list

shell 显示一些乱码

文件名.pdfpdf8.pdf

就是这样。

我想找到每一行文件并将其复制到一个目录 (Desktop/someFolder)。

【问题讨论】:

  • 所以file.list里面的数据是乱码。如果你 100% 确定数据应该是有效的,你在正确的文件夹中,它应该 100% 工作并且这是一个有效的文件......好吧,也许你可以发布 hexdump -C file.list 或 @ 987654326@ 并检查不可读的字符。如果你想read a file line by line in bash你可以在网上找到很多帮助,我推荐bashfaq作为一个很好的参考。
  • Desktop/someFolder 在 Windows 上?在catstdout 时输出乱码的字符。您的文件很可能包含 cat 无法处理的 UTF-16 字符。你可以试试dos2unix file.list
  • 我有一些带有“.”的文件。在文件名中。我使用 RegEx 消除了它们。现在我的猫叫声不再是胡言乱语了。至少

标签: shell spaces


【解决方案1】:

如果您的数据是有效的(请参阅 Kamil 的评论),如下所示的小脚本可以完成您想要的。关于您提到的“换行符”,我只想提一下 Linux/MacOS/BSD 系统使用 \n 而 Windows 使用 \r\n。因此,我建议您按照 Kamil 在评论中的建议执行 hexdump -C file.list,然后您应该查看是否有必要在使用脚本或调整字段分隔符之前进行一些替换(默认为换行符、空格、制表符)。

注意:find . 命令在当前目录 (.) 中搜索,因此您可能希望/需要更改它,除非 file.list 中列出的所有文件都在 /在当前目录下。

#! /bin/bash

dir="$HOME/Desktop/someFolder"
if [ ! -e "$dir" ]; then
  mkdir "$dir"
fi
while read -r ; do
  name=$(find . -name "$REPLY")
  cp -v "$name" "$dir"
done < file.list

【讨论】:

    【解决方案2】:

    这是一个可以满足您需要的管道:

    cat file.list | tr '\n' '\0' | xargs -0 -I{} cp {} Desktop/someFolder
    
    1. cat 将文件列表发送到标准输入
    2. tr 会将换行符转换为空值并将它们发送到
    3. xargs 需要以空值分隔的参数 (-0),并将其中的每一个发送到
    4. cp 最终会将它们复制到目标文件夹。

    【讨论】:

    • 我必须先找到它们,所以我需要在 xargs 和 cp 之间找到一个。我不知道如何在查找中引用当前行,因为它使用 {} 作为匹配文件的占位符,而您的复制命令使用 {} 它来引用参数。我有点困惑
    • 猫损坏文件.list | tr '\n' '\0' | xargs -0 -I{} 找到 . -name '{}' 2>&1 | tee corruptLog.txt 这是我尝试过的,但我的日志文件是空的。如果我这样做 -print \;而不是 2>&1 |三通损坏Log.txt。我得到“查找:+:未知的主要或运算符”。顺便说一下,我使用的是 Mac
    • @nch68 所以file.list 中的一些文件不存在,而那些只指定基本名称而不是完整路径的文件?
    • 完全一样
    猜你喜欢
    • 2023-01-30
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2021-10-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多