搜索部分文件名(UNIX)
在unix上,我有一些文件被重命名为其原始名称,后跟_inodenumber(即文件dog将被重命名为dog_inodeno)。我现在尝试删除inode no,以便在其他地方搜索原始文件名。有人知道我如何做到这一点和必要的编码吗搜索部分文件名(UNIX),unix,search,cut,inode,Unix,Search,Cut,Inode,在unix上,我有一些文件被重命名为其原始名称,后跟_inodenumber(即文件dog将被重命名为dog_inodeno)。我现在尝试删除inode no,以便在其他地方搜索原始文件名。有人知道我如何做到这一点和必要的编码吗 谢谢这应该可以完成这项工作: find . -type f -name "*_[0-9]*" -exec \ sh -c 'for i do b=$(basename "$i") r=$(basename "$i" "_$(ls -i "$i"|aw
谢谢这应该可以完成这项工作:
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 {} +
将脚本的
echo mv
替换为mv
,以实际重命名文件。这里的解决方案仅当文件的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
希望这有帮助。我想重命名文件的脚本可以稍微修改一下,重新命名这些文件。没有?基本上我所有的文件名都是格式化的filename\u inodeno,我想创建一个脚本来剪切所有内容,包括和之后的内容。这正是我建议的脚本所做的,不是吗?