2013-10-03 4 views
0

В unix У меня есть файлы, которые были переименованы в их оригинальное имя, указанное номером _inode (т. Е. Собака файла будет переименована в dog_inodeno). Теперь я пытаюсь удалить индекс inode, поэтому я могу искать исходное имя файла в другом месте. Кто-нибудь знает, как я могу это сделать и кодировать.поиск части имени файла (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 {} + 

Replace echo mv по 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 

Надеюсь, это поможет.

Смежные вопросы