Shell 脚本在一行上列出文件夹中的所有文件

Shell 脚本在一行上列出文件夹中的所有文件

我有这个文件夹结构:

/Brand/ProductCode01
/Brand/ProductCode02

在此输入图像描述

每个 ProductCode## 文件夹包含许多 JPG 文件,例如

image01.jpg, image02.jpg等等

我需要创建一个文件,其中每个 ProductCode 包含一行,列出文件夹“ProductCode##”中存在的所有文件,例如:

/Brand/ProductCode01/image01.jpg /Brand/ProductCode01/image02.jpg /Brand/ProductCode01/image03.jpg
/Brand/ProductCode02/image01.jpg /Brand/ProductCode02/image02.jpg

所有文件都需要在一行中列出,以空格分隔,并在最后一个文件名处以换行符结尾。

有什么建议么?

谢谢。

答案1

不要混淆 CR-LF 和 LF又名C联姻回归L伊内F需要

像这样:

$ tree
.
└── Brand
    └── Ducati
        ├── A 1060
        │   ├── image01.jpg
        │   └── image02.jpg
        ├── A 1061
        │   ├── image01.jpg
        │   └── image02.jpg
        ├── A 1062
        │   ├── image01.jpg
        │   └── image02.jpg
        └── A 1063
            ├── image01.jpg
            └── image02.jpg

6 directories, 8 files
$ for d in ./Brand/Ducati/A*/; do echo "$d"image*.jpg; done | tee file.txt
./Brand/Ducati/A 1060/image01.jpg ./Brand/Ducati/A 1060/image02.jpg
./Brand/Ducati/A 1061/image01.jpg ./Brand/Ducati/A 1061/image02.jpg
./Brand/Ducati/A 1062/image01.jpg ./Brand/Ducati/A 1062/image02.jpg
./Brand/Ducati/A 1063/image01.jpg ./Brand/Ducati/A 1063/image02.jpg

bash可以在和zsh以及和 bourne中工作,ksh就像贝壳一样。

答案2

zsh

{
  for dir ( /Brand/ProductCode<->(Nn/) )
    () {print -rC1 -- "$*"} $dir/image<->.jpg(Nn)
} > your-file.txt

或者对于/里面有任何名称的目录( glob 限定符)/Brand,以及所有常规的文件(.限定符)在其中递归(仍然n使用 glob 限定符按数字排序n):

{
  for dir ( /Brand/*(Nn/) )
    () {printf -rC1 -- "$*"} $dir/**/*(Nn.)
} > your-file.txt

并不是说,由于换行符(或您在此处用作分隔符的空格)与文件路径中的任何字符一样有效,因此您仍然可以为每个品牌获得多行。

答案3

它应该与

for i in /Brand/Ducati/*/; do ( find "$i" -type f | sed -e "s/^/'/" -e "s/$/'/"| tr '\n' ' '|sed "s/ $/\n/" ); done
  • 将列出所有文件名(在 /Brand/Ducati/subdirs/ 的目录树中)(每个子目录一组行)
  • 每个文件名之前和之后都会加上引号(以便稍后管理带有空格和其他特殊字符的文件名)
  • 换行符将被转换为空格
  • 每行的最后一个空格将转换为换行符

答案4

ls -1 | tr '\n' ' '

另请参见 -q 和 -b 标志。

相关内容