2013-10-03 90 views
0

關於unix,我已經將文件重命名爲原始名稱,後面跟着_inode編號(即文件狗將被重命名爲dog_inodeno)。我現在試圖刪除inode不,所以我可以在其他地方搜索原始文件名。有誰知道我可以做到這一點,並編碼neccesary。搜索部分文件名(UNIX)

感謝

+0

我想象重命名文件的腳本可以稍微修改以重新命名它們。沒有? – devnull

回答

0

這應該做的工作:

find . -type f -name "*_[0-9]*" -exec \ 
    sh -c 'for i do 
    b=$(basename "$i") 
    r=$(basename "$i" "_$(ls -i "$i"|awk "{print \$1}")") 
    if [ "$b" != "$r" ]; then 
     echo mv "$i" "$(dirname $i)/$r" 
    fi 
    done' sh {} + 

通過mv的腳本實際重命名文件替換echo mv

+0

基本上我的所有文件名都是格式化的filename_inodeno,我想創建一個腳本來切割包含_和後面的所有內容。 – user2842995

+0

這正是我所建議的腳本所做的,不是嗎? – jlliagre

0

這裏的解決方案只會在文件的inode號是所提到的格式的文件名的一部分時纔會重命名文件,這正是OP想要的。

解決方案在我的最終成功測試。

find ./ -name "*_[0-9][0-9][0-9][0-9][0-9][0-9]" -exec sh 'rename-files.sh' {} \; 

存儲以下腳本以使find命令成功。

#Script Name: rename-files.sh 
#!/bin/bash 

#Store the result of find 
find_result=$1 

#Get the existing file name 
fname_alone=`expr ${find_result} : '.*/\(.*\)' '|' ${find_result}` 
fname_with_relative_path=`expr ${find_result} : '.\(.*\)' '|' ${find_result}` 
fname_with_full_path=`echo "$(pwd)${fname_with_relative_path}"` 

#Get the inode number of file name 
file_inode_no=`find ./ -name ${fname_alone} -printf '%i'` 

#Read the end of name 
end_of_name=`echo $fname_alone | awk -F "_" '{print $NF}' ` 

#Check if end of name contains its file's inode number 
if [ $end_of_name -eq $file_inode_no ] 
then 
    #Remove the inode number at the end of file name 
    new_name=`expr $find_result : '.\(.*\)_.*' '|' $find_result` 
    #Append the path of the file 
    renamed_to=`echo "$(pwd)${new_name}"` 
    #Rename your dog_inodeno to dog 
    mv $fname_with_full_path $renamed_to 
fi 

希望這會有所幫助。