複数のサブディレクトリを新しい場所に移動して名前を変更する

複数のサブディレクトリを新しい場所に移動して名前を変更する

私のディレクトリは次のように設定されます。

  • dir 1
    • 001
      • 11-20-2001-RT SIMULATION-57976
    • 002
      • 11-20-2001-RT SIMULATION-30560
    • 003
      • 08-24-1998-RT SIMULATION-72882

待って、約250項目があります。私の目標は、文字列を含む各サブディレクトリをRT SIMULATION別のディレクトリに移動することです。つまりdir 2、名前を対応する親ディレクトリに変更することです。だから探しています。

  • dir 2
    • 001(*11-20-2001-RT SIMULATION-57976上記の例と一致する必要があります)
    • 002
    • 003

これまで、RT SIMULATIONこのコードを使用してこれらのディレクトリを見つけることができます。for i in $(find /dir1/*/* -name "*RT SIMULATION*" -type d); echo "$i"; done;

dir 2これで、上記の親ディレクトリに基づいてこれらのディレクトリを移動して名前を変更する必要があります。助けやアドバイスはありますか?

答え1

そしてzsh

autoload -Uz zmv
zmv 'dir 1/(*)/*RT SIMULATION*(#q/)' 'dir 2/$1'

を使用し、bashGNUシステムを想定すると、次のことができます。

(
  shopt -s nullglob
  ret=0
  for dir in 'dir 1'/*/*'RT SIMULATION'*; do
    [[ -d $dir && ! -L $dir ]] || continue
    parent=${dir%/*}; parent=${parent##*/}
    mv -iT -- "$dir" "dir 2/$parent" || ret=$?
  done
  exit "$ret"
)

ところで、参照してください検索結果を繰り返すのはなぜ悪い習慣ですか?あなたのfor i in $(find...

答え2

findこれを行うには、Perlバージョンを使用できますrename。たとえば、

まず、テスト環境を設定する必要があります。

$ mkdir /tmp/goldenburrito
$ cd /tmp/goldenburrito
$ mkdir -p 'dir1/001/11-20-2001-RT SIMULATION-5797' \
    'dir1/002/11-20-2001-RT SIMULATION-30560' \
    'dir1/003/08-24-1998-RT SIMULATION-72882'
$ mkdir dir2

次に、「RT SIMULATION」サブディレクトリの名前を変更します。

$ find dir1 -mindepth 2 -maxdepth 2 \
    -type d -name '*RT SIMULATION*' -print0 | 
        rename -0 -n 's:(/\d{3})/.*:$1:; s/^dir1/dir2/'
rename(dir1/003/08-24-1998-RT SIMULATION-72882, dir2/003)
rename(dir1/002/11-20-2001-RT SIMULATION-30560, dir2/002)
rename(dir1/001/11-20-2001-RT SIMULATION-5797, dir2/001)

-mindepth 2以下の2番目のレベルディレクトリにのみ一致を制限するために、およびオプションと共に使用されます。 NULで区切られた出力はスクリプトにパイプされます(ファイル名とディレクトリ名はコマンドライン引数として渡すことも、標準入力から渡すこともできます)。-maxdepth 2finddir1findrename

一致する各ディレクトリ名に対して、renameスクリプトは最初に3桁のディレクトリ名の後のすべてのエントリを削除し、次にディレクトリ名の先頭の "dir1"を "dir2"に変更します。

renameこのオプションは-nテスト実行なので、実際にはディレクトリ名を変更せずに実行するアクションのみを表示します。要件を満たしていることが確認されたら、削除または置換して-n詳細な出力を取得します。-v

また、注:Perlは、展開および/またはインストール方法によっては、または単にと呼ばれることrenameがあります。たとえば、Debianでは呼び出され、パッケージに配置されます(したがって)。file-renameperl-renameprenamerenamerenamerenameapt-get install rename

機能とコマンドラインオプションが完全に異なり、互換性のないrenameユーティリティと混同しないでください。util-linux

を実行してインストールしたバージョン(または言及されているrename -V場合はPerlバージョン)を知ることができます。perlFile::Rename

Perlの名前変更を使用すると、任意の複雑なPerlコードを使用してファイル名を変更できますが、s/search/replace/ファイル名に対して単純なsedと同様の操作を実行するために最も一般的に使用されます。

関連情報