【问题标题】:Linux: 'ls' all jpg files recursively in csvLinux:在csv中递归地'ls'所有jpg文件
【发布时间】:2016-12-12 21:15:22
【问题描述】:

我正在尝试找到一种方法来列出所有子目录和 csv 格式中的所有 jpg 图像而不存在目录名称。

ls -R -1 -m . | grep '.jpg'

ls 命令确实可以输出到 csv,但 grep 命令会破坏 csv 格式,使每个文件出现在新行上,而不是逗号分隔。

我知道我可以使用 'find' 列出图像,但它似乎以与 'ls' 不同的顺序输出文件,而且我没有看到 'find' 的 csv 参数输出

我需要每个子目录中的图像,用逗号分隔。

【问题讨论】:

  • 如果遇到文件名中带有逗号的文件怎么办!
  • 请编辑您的 Q 以显示您的 .csv 应该包含的 ls -l -m 输出。此外,您应该尽最大努力自行创建 .csv 文件。您是否从命令行或awk 或其他语言内部了解printf?祝你好运。
  • *.jpggrep 的不正确正则表达式。 * 必须跟在另一个字符之后,这意味着前面的字符的任意数量。
  • 您应该编写一个简单的脚本来读取其标准输入,并将其转换为 CSV 格式。然后将ls -R | grep '\.jpg' 的输出通过管道传输到该脚本。
  • 你能用一个你期望输出的例子来编辑你的问题吗?在问题中,您说您希望它是“1 个逗号分隔的行”,但在 cmets 中您说您希望每个目录都是不同的行。

标签: linux csv find ls


【解决方案1】:

我相信这可以满足您的需求。输出的每一行都是由逗号分隔的单个目录中的 jpg 列表。

ls -d */ | xargs -i{} sh -c 'cd {};ls -m *jpg'

如果你想知道哪一行是哪个目录,你可以像这样分两步运行它

ls -d */ > dirs.txt 
cat dirs.txt | xargs -i{} sh -c 'cd {};ls -m *txt'

然后dirs.txt 中的第一行将对应输出的每一行。

【讨论】:

  • 此代码易受外壳注入攻击。如果这是在其他用户可以上传到的目录结构中运行的,您真的不希望有一个使用mkdir -p $'./hello/$(rm -rf ~)/' 创建的目录,其中至少有一个*.jpg 文件。
  • 请考虑更安全(更高效,因为它为多个目录重用一个 shell)替代 find . -type d -exec sh -c 'for dir; do cd "$dir" && ls -m *jpg; done' _ {} +
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2016-08-10
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多