我有这个文件夹结构:
/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 标志。