どうぞ ..
これは、最初に構造がどのように見えるかです...
$ 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 はノーオペレーションになります。
いずれにせよ、それが意図されている場合を除き、ルートにファイルが存在しないことをテストするのは良いことです。:-)
お役に立てれば。