|とのmvファイル xargs


18

次のように、/ etc / apache / sites-enabledフォルダーから/ etc / apache / sites-availableフォルダーに多数のファイル(シンボリックリンクではない)を移動しようとしています。

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

しかし、私はubuntu n00bであり、このエラーが発生しています:

mv: target `./real-file' is not a directory

ここで、「real-file」は、開発環境で設定したテストファイルです。私は本番サーバーで他の誰かの混乱を片付けようとしています;-)

回答:


27

コマンドで-execオプションを試すことができますfind

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

ルートが所有するファイルを移動するには、sudo権限が必要です。

xargsコマンドを使用する場合は、-Iオプションを追加します。

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/

7

理想的には、findで-print0を使用する必要があります。そのため、スペースを含むファイル名で問題が生じることはありません。

たとえば、これは動作するはずです:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory

0

別の方法を使用して同じことを実行することもできますが、パフォーマンスが向上します

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

最後\+に、findコマンドが出力を取得し{}て目的の処理を展開することを意味することに注意してください。この方法では、2つのオプションを回避します(\;=各エントリに対してAND新しいコマンドへのパイプxargs

説明はこちらです(マニュアルも確認できますman find

-exec command {} + この-execアクションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を最後に追加することによって構築されます。コマンドの呼び出しの総数は、一致するファイルの数よりもはるかに少なくなります。コマンドラインは、xargsがコマンドラインを作成するのとほぼ同じ方法で作成されます。 コマンド内では、「{}」のインスタンスは1つのみ許可されます。コマンドは開始ディレクトリで実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.