2012-07-21 46 views
2

我有很多文件,有长文件名,符号,空格等。我想随机盲目重新命名所有的一次,同时给他们从1-9a-Z随机文件名。我不想操纵每个文件的名称,因为有时会因为符号,空格,长度等原因而抛出错误。盲目重命名文件 - linux

任何类型的帮助都非常感谢。先谢谢你。

回答

1

您可以使用inodenumber作为文件名。保证在文件系统中是唯一的。

#!/bin/sh 
             # inodenumber+name 
find . -name \*tmp -type f -ls | awk '{print $1," ",$11}' | (
     while read i p; do 
     # UPDATE: extract the basename and suffix 
     b=`basename $p` 
     s="${b##*\.}" 
     echo "b=$b" 
     echo "s=$s" 

     # remove the echo after testing ... 
     echo mv -i $p $i.$s 
     done 
     ) 
#eof 

注意:如果文件名中有空格或制表符,这将不起作用。

+0

是的,这终于适用于我,但是,如何通过重命名所有内容并仍然保留文件扩展名来实现此目的? – thevoipman 2012-07-22 12:04:34

+0

'suffix =“$ {p ## * \。}”'可以做到这一点。可能你应该先从p得到基名。 – wildplasser 2012-07-22 13:48:33

+0

@thevoipman - 完全符合“扩展”的标准?如果我有'backupfile.20120720.tar.gz',你是在第一个点还是最后一个点分开的?在所有情况下,“通用”解决方案都不起作用。每个解决方案都是专门构建的。 – ghoti 2012-07-22 22:43:20

1
  1. 创建临时目录
  2. 对于每个文件,mv filename tmp/$i,其中$i是一个递增编号。
  3. mv tmp/* .
+0

你好,我怎么做$ i作为递增的数字? – thevoipman 2012-07-23 03:03:30

4

也许一个简单的bash脚本,如奥利建议:

#!/bin/bash 
counter=1 
for i in *; do 
    mv "$i" "$counter"; 
    ((counter++)) 
done 

HTH

+2

让bash做数学运算:'((counter ++))' – 2012-07-21 16:33:21

+0

但是诀窍就是随机地*做他的问题。当使用建议的awk脚本来构建涉及分类某些文件的作业问题时,我使用了这个建议的awk脚本。重命名必须是随机的,否则你可以从名单列表中的顺序推断出该类。 – 2013-03-06 13:10:11

+1

@peterkarasev:请参阅下面Oli的回答下的OP评论。 _random_这个词可以通过不同的复杂程度采取几种不同的方式。但是,如果您确实想创建一个“随机”字符串,请使用'/ dev/urandom'。可能是这样的:' Steve 2013-03-06 14:00:26

2

Oneliner与临时文件名(你自己的改变目录):

for f in *; do mv "$f" `mktemp -p /home/user/temp`; done 
+1

+1。你可能想要先生成新的文件名,看看它是否已经存在'while true;做新= $(mktemp); [[-e“$ new”]] ||打破;完成; mv“$ f”“$ new”' – 2012-07-21 16:35:54

+0

您好,我已经尝试过您的建议,它给了我错误: 用法:mktemp [-V] [-dqtu] [-p前缀] [模板] mv:'201207217MsrpnCsa9n6Vht.mp3'后丢失目标文件操作数' 尝试'mv --help'以获取更多信息。 mktemp:无效选项 - - – thevoipman 2012-07-22 06:42:13

+0

好的,我已经将--tmpdir选项更改为-p。立即尝试并给我feedabck。 – igustin 2012-07-22 12:53:03