web-dev-qa-db-ja.com

ファイルを検索して1レベル上に移動

特定の拡張子を持つファイルを検索してから、それらすべてをフォルダー階層の1つ上のレベルに移動しようとしています。

基本的に私は次のようなものを持っています

/path/to/application/files/and/stuff/a1/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a2/nolongerneededirectory/*.*
/path/to/application/files/and/stuff/a3/nolongerneededirectory/*.*

私はこれらを次のように上に移動しようとしています:

/path/to/application/files/and/stuff/a1/*.*
/path/to/application/files/and/stuff/a2/*.*
/path/to/application/files/and/stuff/a3/*.*

理想的には、次のようなことをします。

-bash-3.2$ find /path/to/ -name '*.txt'
output:
/path/to/directories1/test1/test1.txt
/path/to/directories2/test2/test2.txt
/path/to/directories3/test3/test3.txt

then 
mv /path/to/directories1/test1/test1.txt /path/to/directories1/test1.txt
mv /path/to/directories2/test2/test2.txt /path/to/directories2/test2.txt
mv /path/to/directories3/test3/test3.txt /path/to/directories3/test3.txt

私はさまざまなオプションで遊んでいて、周りに尋ねてきました、誰かが何かアイデアがありますか?

編集1:

だから私は試しました

`find /path/to/parent/dir -type f -exec mv {} .. \

しかし、私は許可を拒否されます

5
ideal2545

GNU findがある場合は、次のことができます(例から変更):

find /path/to -type f -execdir mv {} .. \;

ただし、SolarisはPOSIX findを標準として使用しているため、このオプションはありません。ただし、GNUツールが利用できる場合もあります(例:gfind)。

また、-mindepth switchは、この場合、指定された最小ディレクトリ深度のファイルのみを返す場合に非常に便利です。


GNU findなし、代わりにスクリプトを使用:

#!/bin/sh
IFS='
'
for i in $(find /path/to -type f); do
    echo mv -- "${i}" "${i%/*/*}"
done

これは、ファイル名に改行が含まれていない限り機能します。最初に上記のように実行し、問題がない場合はechoを削除します(-mindepth上記の備考)。

2

move_to_parent.shというスクリプトを作成し、実行可能にします。

#!/bin/bash

while [ $# -ge 1 ]
do
   parentPath=${1%/*/*};
   cp "$1" $parentPath;
   shift
done

パラメータ置換はここにあります に関する情報。

Awkを使用してmove_to_parent.shを書き込む別の方法を次に示します-

#!/bin/bash

while [ $# -ge 1 ]
do
   echo $1 | awk -F/ '
             {
                parentPath="";

                for(loop=2;loop<NF-1;loop++)
                {
                   parentPath=parentPath"/"$loop;
                }
                sub(/\ /, "\ ", $0);
                system("mv " $0 " " parentPath );
             }'
   shift
done

次のように実行します-

find /path/to/parent/dir -iname "*.txt" | xargs  /path/to/scripts/move_to_parent.sh
1
bryan