ディレクトリのツリーがあります。それらのいくつかを削除し、これらのディレクトリからすべてのファイルを1つ上のレベルに移動する必要があります。
私はそれを段階的に行う方法を知っていますが、それらは何千もあるので、プロセスを最適化する必要があります。
ディレクトリを探しますfind . -type d -name 'src'
次に、見つかったディレクトリからすべてのファイルを1つ上のレベルに移動する必要があります(../
)。
root
- one
-- two
--- src
- three
-- four
--- five
---- src
最初のsrc
の内容はtwo
に移動し、2番目のsrc
はfive
に移動する必要があります
1つのスクリプトでそれを行うにはどうすればよいですか?
何かのようなもの:
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \;
-i
フラグをmv
に注意してください。何かを上書きすることについて確認を求められた場合は、予期しない限り「いいえ」と言う必要があります。
後でsrc
ディレクトリも削除すると言ったので、次を使用します。
find . -type d -name src -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \; -exec rmdir {} \;
最初にバックアップを作成します。
各レベルにサブディレクトリとしてネストされたsrc
がなく、src
が最新のディレクトリレベルであるとすると、以下がその役割を果たします。
find . -path '*/src/*' -type f -execdir echo mv -t ../ {} +
私が知っている最も安全な方法は次のとおりです。
cd
"ディレクトリの場所"tar
を使用してそれらをどこかに保存します:tar -cvf
"/tmp/mysavfil.tarなどの保存先のファイル名" ":foo barなどのすべてのディレクトリの名前"なので、次のようになります。tar -cvf /tmp/mysavfil.tar foo bar
cd ..
tar xvf /tmp/mysavfil.tar
cd
"ファイルがあった元の場所"; rm -rf foo bar
; rm /tmp/mysavefiltar
はるかに簡単な方法は次のとおりです。
mv foo bar ../.