ls -al | grep -v '^d' | xargs mv -t mysubdir
私はRed Hatシステムで上記のコマンドを広く使用しています。
現在のディレクトリ内のすべてのファイルをmysubdirに移動します。
$ mv --version
Usage: mv [-f] [-i] [-e warn|force|ignore] f1 f2
mv [-f] [-i] [-e warn|force|ignore] f1 ... fn d1
mv [-f] [-i] [-e warn|force|ignore] d1 d2
上記のコマンドに対応するHP-UXは何ですか(HP-UX 11iバージョン2007年2月3日)
答え1
xargs
HP-UX 11iにフラグがある場合はこれを実行できますが、次の出力をどのように-I
使用できるかはわかりません。ls -l
mv
ls -al | grep -v '^d' | xargs -I {} mv {} mysubdir
そうすることができなければ、これが私が好む解決策になると思います。
ls -a | while read ITEM; do test ! -d "$ITEM" && mv "$ITEM" mysubdir; done
どちらもシェル関数やスクリプトに含めることができるため、1行の長さが必ずしも関連しているわけではありません。
答え2
mv -t
これは、GNUコマンド(Linuxのコマンド)が提供する便利さですmv
。他のUnixバリアントにはこれはありません。宛先を最後に入力する必要があります。これxargs
はorと一緒に使用することがあまり便利ではなくなりましたfind … -exec
(それでmv -t
これが発明されました)。
パラメータを正しい順序で取得する1つの方法は、シェルを呼び出すことです。
… | xargs sh -c 'mv "$@" "$0"' mysubdir
(シェルのパラメータ0番です。mysubdir
パラメータは、位置パラメータを設定して一括して渡されます。)xargs
"$@"
これはxargs
強力ではありません。入力には特別な引用構文が必要です。ファイル名にスペースまたは文字のいずれかが含まれていると、\"'
コードの断片が壊れます。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?より多くの情報を知りたいです。ファイル名の特殊文字の問題を回避するには、次のようにしますfind … -exec …
。
find . -name . -o -type d -prune -o sh -c 'mv "$@" "$0"' mysubdir {} +
(-name . -o -type d -prune -o
サブディレクトリを繰り返すことなくスキップします。)
ディレクトリではなくディレクトリを移動するユースケースでは、mysubdir
サブディレクトリ自体がまだ含まれていない場合は、すべてのファイルを移動してからディレクトリを再移動する方が簡単です。
mv * mysubdir/; mv mysubdir/*/ .
あるいは、サブディレクトリに再帰的に移動したくない場合は、シェルループを使用してファイルを列挙し、ディレクトリに属するファイルをスキップできます。
for x in ./*; do
[ -d "$x" ] || mv "$x" mysubdir/
done