尝试在linux服务器上重命名一系列文件。找到我想要的文件很简单:

find . -type f -wholename \*.mbox

当然,作为mbox文件,其中一些在名称中有空格,因此它变为:

find . -type f -wholename \*.mbox -print0

我正在使用xargs,以便我可以重命名文件:

find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/}

在给出INBOX.mbox的情况下,echo应返回类似INBOX的内容,但bash抱怨:

bash: ${"{}"/.mbox/}: bad substitution

我该如何解决这个问题?如果可能的话,我想尝试将它保存在find / xargs解决方案中,这样我就不会在它周围添加很多循环结构。

有帮助吗?

解决方案

尝试

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh

如果某些文件包含双引号字符,这不是100%的傻瓜证明,但我认为你可以忽略它:)

其他提示

GNU Parallel http://www.gnu.org/software/parallel/ 有{。}删除扩展名:

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.}

如果您知道文件名不包含\ n那么这将起作用:

find . -type f -wholename \*.mbox | parallel mv {} {.}

我想你需要这个:

find . -wholename \*.mbox | awk '{new=<*>; gsub("\.mbox<*>quot;, "", new) ; system("mv \"" <*> "\" \"" new "\"") }'

(应该是gawk和mawk兼容,在mawk上测试)。它不使用xargs,但请注意,它不会为每个移动的文件分叉一个新进程。如果您需要移动大量文件,您会发现优势。 Warrning:如果任何文件的名字中包含换行符,你就会遇到麻烦(但如果这是一个问题,那么上帝就和你在一起)。

通过使用xargs删除单个 rm 调用上的多个文件,您可以进一步增强此解决方案。

如果你真的需要速度,我建议你使用python脚本而不是awk。这将完成所有 rm 而没有一个分叉。

你能用rename(1)吗?它配备了perl。

您可以尝试:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'

你的问题是试图管道进入xargs。到那时,&quot; {}&quot; 并不意味着什么。

重命名文件(假设您正在使用bash)

find . -type f -wholename \*.mbox -print0 | \
    while read I ; do
        mv $I $(echo $I | sed 's/\.mbox//') ;
    done ;

在这里,你应该这样做......

# find .
.
./test.tst
./test1.tst
./test2.tst
./test/test4.tst
./test/test5.tst

#

for file in `find . -type f`
do
mv $file ${file%.tst}.new
done

# find .
.
./test
./test/test4.new
./test/test5.new
./test1.new
./test2.new
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top