次のフォルダ構造があります。
/ms/files/a/
/fb/files/a/
/db/files/a/
次のようにする必要があります。
/ms/files/b/
/fb/files/b/
/db/files/b/
以下を使用して、移動または名前を変更する必要があるフォルダを見つけることができます。
find . -path "*/files/a" -type d
しかし、結果の名前を変更するには?
答え1
一方通行:
for d in /*/files/a/
do
mv "$d" "${d%a/}b"
done
*
...すべての初期の「クライアント」最上位ディレクトリと目的のサブディレクトリ構造を一致させるために使用されます/files/a/
。その後、パラメータ拡張を使用してa/
各パラメータの尾を削除し、名前を変更するためにパラメータをb
「置換」します。
答え2
ハッカーソリューション:
eval $(find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/')
Sedはmvコマンドのパラメータを生成します。その後、出力が評価されます。
を削除すると、eval $()
パス内の3つのテストフォルダで実行されているように見えます。
$ find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/'
mv ./client1/files/a ./client1/files/b;
mv ./client2/files/a ./client2/files/b;
mv ./client3/files/a ./client3/files/b;
答え3
次の方法で行われており、うまく機能します。
for i in /ms/files/ /fb/files/ /db/files/; do find $i -type d; done| sed -n '/a$/p'| awk '{print "sudo mv" " " $1 " " substr($1,1,10)"b/"}'|sh