Unix: C-shell:重命名重复文件
Unix: C-shell:Rename the duplicate files
我有很多类似格式的文件夹;没有-没有-阿尔法*-没有;例如:11DATA20、12DATA21、13DATA22。
任务是重命名目录,去掉前面两个数字;例如:11DATA20 到 DATA20。
到目前为止,这是我的代码:
foreach file(`find . -type d | awk -F/ 'NF == 3'`)
set old = `echo $file| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set dirname=`basename "$file"`
if ( -d "$new/$dirname" ) then
mv $file/* $new/$dir/
rmdir $file
else
mkdir -p $new
mv -f $file $new
endif
rmdir $old/*
rmdir $old
end
输出:
$file = ./11DATA20/CARTER/
$old = ./11DATA20
$new = DATA20
我的问题是如果移动到新目录时 $file/* 中有重复文件,重复文件将替换新目录中的旧文件。而且我还需要在移动到新目录时重命名重复文件。如何解决这个问题?
试试这个。它假定只移动文件。它只是将 _a 附加到文件名,所以如果您有特殊需要或确实有目录,您只需相应地更改 shell 脚本。我还重命名了一些变量,但这只是为了我自己方便。
#!/bin/csh
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
#echo "$old $new $from"
if (! -d "$new" ) then
#echo "create new directory $new"
mkdir $new
endif
end
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
# echo "$old $new $from"
foreach subdir(`find $old/* -type d`)
set base1 = `basename $subdir`
if (! -d $new/$base1 ) then
#echo "create $new/$base1"
mkdir $new/$base1
endif
end
end
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
#echo "$old $new $from"
foreach subdir(`find $old/* -type d`)
set base1 = `basename $subdir`
#echo "original directory: $subdir, new directory: $new/$base1"
foreach source_files(`find $subdir/* -type f`)
set from_file = `basename $source_files`
set from_dir = `dirname $source_files`
#echo "move file $from_dir/$from_file to $new/$base1"
if (! -f $new/$base1/$from_file ) then
mv $from_dir/$from_file $new/$base1
endif
if ( -f $new/$base1/$from_file ) then
set append = "_a"
set letter = "a"
set to_file = "$from_file$append"
#echo "new filename $to_file"
while ( -f $new/$base1/$to_file )
set append = "$append$letter"
set to_file = "$from_file$append"
#echo "file exist, change destination filename to $to_file"
end
mv $from_dir/$from_file $new/$base1/$to_file
endif
end
end
end
我有很多类似格式的文件夹;没有-没有-阿尔法*-没有;例如:11DATA20、12DATA21、13DATA22。
任务是重命名目录,去掉前面两个数字;例如:11DATA20 到 DATA20。
到目前为止,这是我的代码:
foreach file(`find . -type d | awk -F/ 'NF == 3'`)
set old = `echo $file| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set dirname=`basename "$file"`
if ( -d "$new/$dirname" ) then
mv $file/* $new/$dir/
rmdir $file
else
mkdir -p $new
mv -f $file $new
endif
rmdir $old/*
rmdir $old
end
输出:
$file = ./11DATA20/CARTER/
$old = ./11DATA20
$new = DATA20
我的问题是如果移动到新目录时 $file/* 中有重复文件,重复文件将替换新目录中的旧文件。而且我还需要在移动到新目录时重命名重复文件。如何解决这个问题?
试试这个。它假定只移动文件。它只是将 _a 附加到文件名,所以如果您有特殊需要或确实有目录,您只需相应地更改 shell 脚本。我还重命名了一些变量,但这只是为了我自己方便。
#!/bin/csh
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
#echo "$old $new $from"
if (! -d "$new" ) then
#echo "create new directory $new"
mkdir $new
endif
end
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
# echo "$old $new $from"
foreach subdir(`find $old/* -type d`)
set base1 = `basename $subdir`
if (! -d $new/$base1 ) then
#echo "create $new/$base1"
mkdir $new/$base1
endif
end
end
foreach topdir(`find . -type d -name \[0-9\]\* | awk -F/ 'NF == 2'`)
set old = `echo $topdir| cut -f 1-2 -d '/'`
set new = `echo $old | cut -c 1-2,5-`
set from=`basename "$topdir"`
#echo "$old $new $from"
foreach subdir(`find $old/* -type d`)
set base1 = `basename $subdir`
#echo "original directory: $subdir, new directory: $new/$base1"
foreach source_files(`find $subdir/* -type f`)
set from_file = `basename $source_files`
set from_dir = `dirname $source_files`
#echo "move file $from_dir/$from_file to $new/$base1"
if (! -f $new/$base1/$from_file ) then
mv $from_dir/$from_file $new/$base1
endif
if ( -f $new/$base1/$from_file ) then
set append = "_a"
set letter = "a"
set to_file = "$from_file$append"
#echo "new filename $to_file"
while ( -f $new/$base1/$to_file )
set append = "$append$letter"
set to_file = "$from_file$append"
#echo "file exist, change destination filename to $to_file"
end
mv $from_dir/$from_file $new/$base1/$to_file
endif
end
end
end