Pit*_*ght 3 command-line bash scripts paths
我有一堆文件,在许多文件夹中,我想创建 txt 文件,其中包含这些文件的完整路径以及它们所在目录的空间和名称。例如:
halva/foo/bar/1/something.jpg 1
halva/foo/bar/2/another.jpg 2
halva/foo/bar/2/anotheranother.jpg 2
Run Code Online (Sandbox Code Playgroud)
创建路径列表类似于
find `pwd` -name *.jpg
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何在路径后添加空格和目录名。我正在尝试对学校项目的东西进行分类。
$ find . -name *.jpg -exec bash -c 'd=${1%/*}; d=${d##*/}; printf "%s %s\n" "$1" "$d"' Out {} \;
./halva/foo/bar/1/something.jpg 1
./halva/foo/bar/2/another.jpg 2
./halva/foo/bar/2/anotheranother.jpg 2
Run Code Online (Sandbox Code Playgroud)
对于由 找到的每个文件find,我们运行 bash 脚本d=${1%/*}; d=${d##*/}; printf "%s %s\n" "$1" "$d",其中第一个参数$1是文件名。
我们使用后缀删除,d=${1%/*}来从完整文件名中获取目录名。然后我们使用前缀删除,d=${d##*/}来从 中删除最后一个目录的名称以外的所有内容d。最后,printf用于打印输出。
Out除非 bash 命令中出现错误,否则不会使用上述命令中的字符串,在这种情况下,它用作有效命令名称$0.
要将输出保存到文件,我们使用重定向:
find . -name *.jpg -exec bash -c 'd=${1%/*}; d=${d##*/}; printf "%s %s\n" "$1" "$d"' Out {} \; >SchoolProject.txt
Run Code Online (Sandbox Code Playgroud)
该>符号将标准输出重定向到它后面的文件名。