1

私がやりたいことは、特定のファイルを再帰的に見つけて、それらを現在のディレクトリの上位レベルに移動することです。

例えば、

foo1/bar1/abc
foo2/bar2/bar3/abc

に更新されます

foo1/abc
foo2/bar2/abc

私は試した

find -name \*abc -exec /bin/mv '{}' .. \;

しかし、これはすべてを の上位ディレクトリに移動したため、間違っています$PWD

物事を動的に上に移動する同様のコマンドラインの方法はありますか? それとも、より複雑なスクリプトを使用する必要がありますか?

4

1 に答える 1

2

どうぞ ..

これは、最初に構造がどのように見えるかです...

$ tree

[.]
 +-- foo1
 !   `-- bar1
 !       `-- abc
 !
 `-- foo2
     `-- bar2
         `-- bar3
             `-- abc

次に、コマンドを実行してファイルを移動します

$ find . -type f -name "*abc" -exec bash -c ' mv -v  {} `dirname {}`/.. '  \;

これにより、この出力が生成されます...

`./foo1/bar1/abc' -> `./foo1/bar1/../abc'
`./foo2/bar2/bar3/abc' -> `./foo2/bar2/bar3/../abc'

ディレクトリ構造は次のようになります。

$ tree

[.]
 +-- foo1
 !   +-- abc
 !   `-- bar1
 !
 `-- foo2
     `-- bar2
         +-- abc
         `-- bar3

重要なビット...

-type f        <-- Make sure that you pick files not folders, if you need folders too omit this.
-name "*abc"   <-- Your file-match pattern
-exec bash -c ' mv -v  {} `dirname {}`/.. '  \;

ここで.. bashを実行し、ファイルのディレクトリを見つける文字列を渡し、最後に「/..」を追加して、mvがファイルを親ディレクトリに移動するようにします。

重要な警告:

検索のルートにファイルがあると予想される場合、最終的にファイルは検索ルートの親ディレクトリに移動し、一致パターンから永久に除外されます。

また

ファイルシステムのルートにいる場合、ファイルは常に一致し、mv はノーオペレーションになります。

いずれにせよ、それが意図されている場合を除き、ルートにファイルが存在しないことをテストするのは良いことです。:-)

お役に立てれば。

于 2012-07-19T00:47:54.477 に答える