![获取文件相对路径](https://linux22.com/image/1005222/%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84.png)
我有两个目录 A 和 B。每个目录包含一个 zip。
我怎样才能将这两个 zip 文件的路径写入文本文件?
目录系统示例:
FILES/ONE/one.zip
FILES/TWO/two.zip
我想从 FILES 目录运行命令
答案1
您可以按照以下方式使用该find
命令,并将其输出定向到文件:
/tmp/FILES$ find . -name "*.zip" -print > outfile.txt
zip
查找当前文件夹内的每个以 结尾的文件( FILES
) 并打印其路径
该命令的输出find
被定向到文本文件中:
其内容outfile.txt
为:
/tmp/FILES$ cat outfile.txt
./TWO/two.zip
./ONE/one.zip
find
请注意,如果您在文件夹上方的一个文件夹中执行该命令FILES
,则您的输出还将包括FILES
该文件夹的一部分。
例如当 find 输出指向stdout
/tmp$ find FILES -name "*.zip" -print
FILES/TWO/two.zip
FILES/ONE/one.zip
答案2
简单的 shell 通配符可以实现这一点。例如,给定
$ tree .
.
├── ONE
│ └── one.zip
└── TWO
└── two.zip
2 directories, 2 files
然后
$ printf '%s\n' */*.zip
ONE/one.zip
TWO/two.zip
通过附加到命令将输出重定向到文件> outfile
。如果要添加./
以使相对路径更明确,请更改%s
为./%s
$ printf './%s\n' */*.zip > outfile
$ cat outfile
./ONE/one.zip
./TWO/two.zip
如果你想这样做递归地,然后bash
支持,如果你启用了globstar
shell 选项,例如
$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.zip
FILES/ONE/one.zip
FILES/TWO/two.zip
如果您在脚本中使用此功能,您可能nullglob
也应该启用该选项,以正确处理不存在匹配文件的情况。
答案3
或者你可以用regex
find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt
输出相同:
./TWO/two.zip
./ONE/one.zip
问题是它将匹配任何子文件夹中的所有 zip 文件。如果您可以定义包含文件的子文件夹,则可以执行以下操作:
find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt