私のディレクトリは次のように設定されます。
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'
を使用し、bash
GNUシステムを想定すると、次のことができます。
(
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 2
find
dir1
find
rename
一致する各ディレクトリ名に対して、rename
スクリプトは最初に3桁のディレクトリ名の後のすべてのエントリを削除し、次にディレクトリ名の先頭の "dir1"を "dir2"に変更します。
rename
このオプションは-n
テスト実行なので、実際にはディレクトリ名を変更せずに実行するアクションのみを表示します。要件を満たしていることが確認されたら、削除または置換して-n
詳細な出力を取得します。-v
また、注:Perlは、展開および/またはインストール方法によっては、または単にと呼ばれることrename
があります。たとえば、Debianでは呼び出され、パッケージに配置されます(したがって)。file-rename
perl-rename
prename
rename
rename
rename
apt-get install rename
機能とコマンドラインオプションが完全に異なり、互換性のないrename
ユーティリティと混同しないでください。util-linux
を実行してインストールしたバージョン(または言及されているrename -V
場合はPerlバージョン)を知ることができます。perl
File::Rename
Perlの名前変更を使用すると、任意の複雑なPerlコードを使用してファイル名を変更できますが、s/search/replace/
ファイル名に対して単純なsedと同様の操作を実行するために最も一般的に使用されます。