!["mv ./* ./subdirdir/"を実行する正しい方法は何ですか? [コピー]](https://linux33.com/image/68037/%22mv%20.%2F*%20.%2Fsubdirdir%2F%22%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%AD%A3%E3%81%97%E3%81%84%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
現在のディレクトリには多くのファイルとディレクトリがあります。すべてのファイルをサブディレクトリに移動したいと思います。
mv ./* subdir/
cannot move ./subdir to a subdirectory of itself...
警告は無害ですが、mvが1を返すため、他のファイルが移動されたことを確認できません。
cpは役に立ちますが、移動する大容量ファイルがあるため、十分に効率的ではありません。
スクリプトも機能しているようですが、可能であれば1行をお勧めします。
答え1
以下を検索してこれを実行できます。
$ find -maxdepth 1 -not -name subdir -print0 | xargs -0 mv -t subdir
どこ:
-maxdepth 1
検索巡回を現在のディレクトリに制限します(POSIXオプションではありませんが、GNUなどで利用可能ですfind
)。-print0
findにゼロバイトで行を終了するように指示します。したがって、コマンドはPOSIXではありませんが、GNUが提供する珍しいファイル名(改行文字など)を処理できます。find
-0
0バイトを教えてくださいxargs
。繰り返しますが、POSIXではありませんが、例えばGNUでは理解されています。xargs
-t
最初の引数がターゲット(最後の引数ではない)であることを示しますmv
。これはこのユースケースに最適です。以前と同様に、オプションはPOSIXにはありませんが、たとえばGNUによって実装されています。mv
答え2
次のように、より簡潔な別の形式を試してみることができます。
mv `ls -A |grep -v <subdir>` <subdir>
ここで、バックスラッシュ文字は以下を表します。コマンドの置き換えつまり、 mv
引数の一部としてバックスラッシュで囲まれたコマンド出力を使用して実行されます。