【问题标题】:How can I pass a list of image names from a csv file to the find command?如何将 csv 文件中的图像名称列表传递给 find 命令?
【发布时间】:2018-01-11 15:11:06
【问题描述】:

所以我有一个 csv 文件,其中包含格式如下的图像名称列表:

FPC-84WB.jpg
Arctic-Blue.jpg
Azuria.jpg
Azuria-Reflective.jpg
BLACK-REFLECTIVE.jpg
Bronze.jpg
Champagne.jpg
Copper.jpg
Light-Green.jpg
Orange.jpg
Pacific-Blue.jpg
....
last-image.jpg

我想使用find /var/www/html/ -name [name of image] -exec convert [options] {} \; 批量转换所有这些图像,而不必去寻找它们的确切目录或路径。那么如何将 csv 的每一行传递给 find 命令来批量转换所有这些图像。

我尝试用谷歌搜索来解决这个问题,但出现的一切都是关于将输出从 find 传递到另一个命令或文件,而我想要相反。

编辑:pics.csv 我用来在本地机器上测试:

delta-heat-logo.jpg
two-dogs-designs-logo.jpg
modern-flames-logo.jpg
polyscience-logo.jpg
real-fyre-logo.jpg
the-good-one-logo.jpg
man-law-logo.jpg
american-outdoor-grill-logo.jpg
afd-logo.jpg
KAGspritesheet.png
tec-logo.jpg
ogr-logo.jpg
FPDspritesheet.png
hpc-logo.jpg
primo-logo.jpg
american-fireglass-logo.jpg
napoleon-logo.jpg
cavo-logo.jpg
coc-logo.jpg
fire-magic-logo.jpg
spotix-logo.jpg
fornetto-logo.jpg
Blaze-Grills-Logo.jpg
bge-logo.jpg
DCS-logo.jpg
greatco-logo.jpg
DCS-Logo-HP.jpg
skytech-logo.jpg
afd-logo_1.jpg
homecrest-logo.jpg
Lynx-Logo-BW-White.jpg
fusionchef-logo.jpg
amantii-logo.jpg
pics.txt
good-one-logo.jpg
jatex-logo.jpg
Warming-Trends.jpg
polyscience-logo_1.jpg
SPOTIXspritesheet.png
poly-science-logo.jpg
summerset-logo.jpg
twin-eagles-logo.jpg

面对同样问题的其他人的工作命令是:

find [path] \( $(sed 's/.*/-o -name &/; 1s/-o //' [csv file]) \) -exec convert {} [options] {} \;

【问题讨论】:

  • 您知道文件中列出的所有名称都不包含任何空格或制表符(或引号或美元符号)吗?据推测,没有一个名称包含任何换行符?文件路径中的空格目前不是问题。图像列表有多大?几百个或更少的名字,还是成千上万个?
  • @JonathanLeffler 所有图像都没有空格,并且列表长达数百。我只需要修剪每一行末尾的空格,然后一次将它们传递给find 命令。我不知道任何文件的确切路径,因为我们使用 magento,我们的服务器上散布着 10 或数千张图像,并且产品图像目录非常复杂。

标签: linux shell command-line find


【解决方案1】:

所有显示的文件名都仅使用可移植文件名代码集 (A-Za-z0-9_-.) 中的字符。假设在我们看不到的列表部分保持良好,并且列表长度不超过几百个条目,那么您可以使用以下内容:

find /var/www/html/ \( $(sed 's/.*/-o -name &/; 1s/-o //' file.csv) \) \
     -exec convert [options] {} \;

如果转换器程序在一次调用中接受多个参数,请将\; 替换为+

这个想法是您将生成一个如下所示的命令:

find /var/www/html/ ( 
           -name FPC-84WB.jpg
        -o -name Arctic-Blue.jpg
        -o -name Azuria.jpg
        -o -name Azuria-Reflective.jpg
        -o -name BLACK-REFLECTIVE.jpg
        -o -name Bronze.jpg
        -o -name Champagne.jpg
        -o -name Copper.jpg
        -o -name Light-Green.jpg
        -o -name Orange.jpg
        -o -name Pacific-Blue.jpg
        ....
        -o -name last-image.jpg
    ) -exec convert [options] {} ;

我在哪里显示 find 会看到什么(我已经删除了反斜杠,并且空格分隔了参数)。

关于基本文件名中字符的问题的意义在于,使用可移植文件名字符集避免了引用每个文件名的需要,这使得工作比你必须处理(一些the) 可移植文件名字符集之外的字符。文件列表的大小很重要,以免超出单个命令的长度限制——这通常很大(例如 100 KiB 或更多),但不是无限的。

【讨论】:

  • 我收到 find: paths must precede expression: -exec 错误,但路径在 -exec 之前。我猜我们会在某个时候用 `\` 取消它。
  • 这很好奇。当我逐字运行它时(在 Mac 上),我得到 find: /var/www/html/: No such file or directory(这是准确的);当我用$HOME/lib 替换那个路径时(现有的中等大小的目录——不过没有JPG文件),我运行没有错误(也没有任何输出)。我在当前目录的列表中创建了前 5 个名称,并在 convert 之前使用了 echo 并获得了这些名称。检查您是否正确复制了内容。或者使用仅包含 4 个名称的文件列表显示您执行的操作。您在 find 命令的分组括号之前包含了反斜杠。
  • 这里是确切的命令find /home/nate/Pictures/Manufacturer_favicons/ \( $(sed 's/.*/-o -name &/; 1s/-o //' pics.csv) \) \ -exec convert -quality 75 {} \;。我首先在本地机器上的一些图像上对此进行测试。我将编辑我的原始帖子以显示我用来测试的.csv
  • 不需要\)-exec 之间的反斜杠,除非命令延伸到换行符上。很难在评论中判断它是否都在一行中。但是,如果您将所有内容放在一行中并包含该反斜杠,则会出现错误 - 我得到了 find:  -exec: unknown primary or operator-exec 之前有一个额外的空格)。
  • 使用 GNU find,而不是 BSD (macOS) find,我得到“路径必须在表达式之前”错误而不是“未知的主要或运算符”错误。
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 2013-06-15
  • 2015-12-20
  • 2013-04-02
  • 2019-02-12
  • 2012-02-04
  • 1970-01-01
  • 2015-02-17
相关资源
最近更新 更多