Unix:C-shell:重命名重复文件
我有很多类似格式的文件夹;无α*-无;例:11DATA20、12DATA21、13DATA22 任务是通过删除前面的两个数字来重命名目录;例:11DATA20到DATA20 到目前为止,这是我的代码:Unix:C-shell:重命名重复文件,unix,rename,csh,Unix,Rename,Csh,我有很多类似格式的文件夹;无α*-无;例: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=`b
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
查找时出错:错误选项-mindepth,我是否应该将find$old-mindepth 1更改为find$old | awk-F/'NF==2'?我在os x yosemite上这样做了。它使用BSD发行版中的查找版本。你在用什么操作系统?Linux?Solaris、AIX、HP/UX?这些可能没有mindepth,但可能是等效的。奇怪。我在sunos 5.8上找到了这个查找手册页,但您可能在不同的solaris版本上。这是最重要的。我使用mindepth的原因是为了防止find返回文件夹本身。也许可以将其更改为“find$old/*”?我已经更改为find$old/*”。但是相同的文件夹名称;例如:/11DATA20/CARTER/和/12DATA20/CARTER/,文件夹/12DATA20/CARTER/中的文件将移到DATA20而不是DATA20/CARTER。。。