2012-07-21 48 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