web-dev-qa-db-ja.com

リストされたディレクトリからすべてのファイルを1レベル上に移動します

ディレクトリのツリーがあります。それらのいくつかを削除し、これらのディレクトリからすべてのファイルを1つ上のレベルに移動する必要があります。

私はそれを段階的に行う方法を知っていますが、それらは何千もあるので、プロセスを最適化する必要があります。

ディレクトリを探しますfind . -type d -name 'src'次に、見つかったディレクトリからすべてのファイルを1つ上のレベルに移動する必要があります(../)。

root
- one
-- two
--- src
- three
-- four
--- five
---- src

最初のsrcの内容はtwoに移動し、2番目のsrcfiveに移動する必要があります

1つのスクリプトでそれを行うにはどうすればよいですか?

2
lasoweq

何かのようなもの:

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 {} \;

最初にバックアップを作成します。

2
Wildcard

各レベルにサブディレクトリとしてネストされたsrcがなく、srcが最新のディレクトリレベルであるとすると、以下がその役割を果たします。

find . -path '*/src/*' -type f -execdir echo mv -t ../ {} +
1
αғsнιη

私が知っている最も安全な方法は次のとおりです。

  1. cd "ディレクトリの場所"
  2. 次に、tarを使用してそれらをどこかに保存します:tar -cvf "/tmp/mysavfil.tarなどの保存先のファイル名" ":foo barなどのすべてのディレクトリの名前"なので、次のようになります。tar -cvf /tmp/mysavfil.tar foo bar
  3. 次に、次のようにします。cd ..
  4. 次に:tar xvf /tmp/mysavfil.tar
  5. オプションで、不要になったファイルを次のように削除する場合:cd "ファイルがあった元の場所"; rm -rf foo bar; rm /tmp/mysavefiltar
  6. 完了です

はるかに簡単な方法は次のとおりです。

  • mv foo bar ../.
1
Faramarz Rabii