Unix:C-shell:重命名重复文件

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

我有很多类似格式的文件夹;无α*-无;例: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

查找时出错:错误选项-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。。。