shell 解析文件名的最佳方法是什么?[重复]

llew8vvj  于 2023-04-07  发布在  Shell
关注(0)|答案(2)|浏览(110)

此问题已在此处有答案

How to remove files using find and rm command?(3个答案)
4天前关闭。
我最初写了一个命令,以一定的间隔定期删除自动生成的Emacs文件,从我的当前目录开始(在意识到你可以在Emacs中禁用它之前):

#!/bin/sh

clean ()
{
    find . -name "*~" -type f | while read f; do rm "$f"; done
}

while true; do clean; sleep 1800; done &

我发现上面的脚本并不总是有效。原因如下:

sh-3.2$ ls
FilenameWithNewLine?End One-Word-Filename   Two-Word Filename
sh-3.2$ find . -name "*" -type f
./Two-Word Filename
./One-Word-Filename
./FilenameWithNewLine
End

这就引出了我关于解析文件名的最佳方法的问题,特别是关于管道铣削。
为了清楚起见,我要求一个通用的方法来解析文件名。
下面是另一个例子:

sh-3.2$ ls > myfilenames.txt
sh-3.2$ cat myfilenames.txt | grep 'mypattern'

由于我提到的同样的问题,上述方法将无法工作。
我正在寻找一个一般性的答案,并用例子来说明我的观点。

g6baxovj

g6baxovj1#

使用POSIX find,您可以直接调用rm

clean ()
{
    find . -name "*~" -type f -exec rm {} +
}

这也适用于更复杂的壳处理:

find . -name "*~" -type f -exec sh -c '
    for f; do
        rm "$f"
    done
' -- {} +

请记住,如果有大量的输入文件名,则可能会多次调用-exec

find / -exec sh -c 'echo $#' -- {} + 2>&-

要处理带有嵌入换行符的文件名,需要一种明确的格式。文件名中不允许使用空值,因此使用空分隔的I/O可以安全地处理任意文件名。
如果你不太担心POSIX兼容性,一些实用程序的实现支持空分隔的输入和/或输出。例如:

find -print0

xargs -0 

sort -z

grep -z

awk -v RS='\0'
1hdlvixo

1hdlvixo2#

我会怎么做:

clean ()
{
    find . -name "*~" -type f -delete
}

相关问题