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