尝试在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解决方案中,这样我就不会在它周围添加很多循环结构。
答案 0 :(得分:8)
尝试
find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh
如果某些文件包含双引号字符,这不是100%的傻瓜证明,但我认为你可以忽略它:)
答案 1 :(得分:2)
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 {} {.}
答案 2 :(得分:1)
您可以尝试:
find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'
你的问题是试图管道进入xargs。到那时"{}"
并不意味着什么。
重命名文件(假设你在bash下)
find . -type f -wholename \*.mbox -print0 | \
while read I ; do
mv $I $(echo $I | sed 's/\.mbox//') ;
done ;
答案 3 :(得分:1)
我想你需要这个:
find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }'
(应该是gawk和mawk兼容,在mawk上测试)。它不使用xargs,但请注意,它不会为每个移动的文件分叉一个新进程。如果您需要移动大量文件,您会发现优势。 Warrning:如果任何文件的名字中包含换行符,你就会遇到麻烦(但如果这是一个问题,那么上帝就和你在一起)。
通过使用xargs删除单个rm
调用中的多个文件,您可以进一步增强此解决方案。
如果你真的需要速度,我建议你使用python脚本而不是awk。如果没有一个分叉,那将会完成所有rm
。
答案 4 :(得分:1)
你能用rename(1)吗?它配备了perl。
答案 5 :(得分:0)
在这里,你应该这样做......
# 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