Fly*_*Cat 3 linux command-line find-in-files
我的系统中有大量文件,每个文件都有一个对应的文件名。例如,
test.pdf
有一个test-project.zip
test2.pdf
有一个test2-project.zip
test.pdf
和test2.pdf
是原始文件,test-project.zip
和test2-project.zip
是由我的脚本生成的。
我需要找出我所有的原始文件是否都与原始文件'filename'-project.zip
相对应。
我可以用
find /project/ -name "*.pdf" | wc -l
find /project/ -name "*-project.zip" | wc -l
Run Code Online (Sandbox Code Playgroud)
找出数字是否匹配,但我需要知道哪个文件没有对应的文件。
任何人都可以帮助我吗?非常感谢!
快速脚本,根据您的需要进行调整:
#!/usr/bin/env bash
find /project/ -name '*.pdf' -print0 | while read -d $'\0' i; do
if [ ! -e "${i/%.pdf/-project.zip}" ]; then
echo "${i/%.pdf/-project.zip} doesn't exist!"
fi
done
exit 0
Run Code Online (Sandbox Code Playgroud)
-d $'\0'
将分隔符 for 设置为read
空字节,而-print0
与 for 等效find
,因此这对于名称中带有空格和换行符的文件应该是防弹的(在这种情况下显然无关紧要,但一般来说很有用)。${i/%.pdf/-project.zip}
取代了.pdf
在可变的末端$i
与-project.zip
。除此之外,这都是标准的 shell 脚本编写的东西。
如果你想进一步缩短它,你也可以使用
[ -e "${i/%.pdf/-project.zip}" ] || echo "${i/%.pdf/-project.zip} doesn't exist!"
Run Code Online (Sandbox Code Playgroud)
...而不是if
声明。我认为if
如果您使用多个短线(您可以通过使用函数来解决这个问题,但此时与使用if
.
假设你有 bash 4+(你可能有;你可以检查bash --version
),你可以使用 globstar 选项而不是find
:
#!/usr/bin/env bash
shopt -s globstar
for f in /project/**/*.pdf; do
if [ ! -e "${f/%.pdf/-project.zip}" ]; then
echo "${f/%.pdf/-project.zip} doesn't exist!"
fi
done
exit 0
Run Code Online (Sandbox Code Playgroud)
这具有纯 bash 的优点,因此它应该更快(不过,至少有数百个文件时才明显如此)。
归档时间: |
|
查看次数: |
3862 次 |
最近记录: |