特定の拡張子を持つファイルを検索してから、それらすべてをフォルダー階層の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 {} .. \
しかし、私は許可を拒否されます
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
上記の備考)。
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