にファイルがあります/home/jjblack/foo/
。そのディレクトリのすべての内容をに移動したいと思います/home/jjblack/foo/bar/
。
ディスク容量が不足しているため、他の場所にコンテンツをコピーできません。私はできます。
mv /home/jjblack/foo /home/jjblack/xyz
mkdir /home/jjblack/foo
mv /home/jjblack/xyz /home/jjjblack/foo/bar
しかし、これよりもエレガントなワンラインソリューションがありますか?
答え1
ここに短縮されたパス名を含むコマンドシーケンスは、jjblack
現在のユーザーを想定しています(~jjblack
代わりに別のものを使用してください~
)。
mv ~/foo ~/xyz
mkdir ~/foo
mv ~/xyz ~/foo/bar
これはとてもエレガントだと思います。欠落している唯一のことは、前のコマンドが失敗した場合に次のコマンドが実行されないことを保証するいくつかの安全チェックです。
[ ! -e ~/xyz ] &&
mv ~/foo ~/xyz &&
mkdir ~/foo &&
mv ~/xyz ~/foo/bar
または1行に入力する必要がある場合:
[ ! -e ~/xyz ] && mv ~/foo ~/xyz && mkdir ~/foo && mv ~/xyz ~/foo/bar
これは、「単純なコマンド」の「ANDリスト」で構成される単一の「完全なコマンド」(シェル構文の意味)です。
これにより、隠された名前に関する問題が回避され、潜在的に何百万もの名前のリストが生成されるワイルドカードパターンが拡張されず、個々のファイルを移動しようとせず(個々のディレクトリを移動するよりも遅くなります)、大規模な追加ファイル使用しません。ファイルストレージスペース。さらに、元のディレクトリのメタデータ(所有権や権限など)が新しいfoo
名前に正常に移動されましたbar
。
同じことを行うもう1つの方法は、最初に新しい親ディレクトリを作成し、最後に名前を変更することです。これにより-e
、名前がすでに存在する場合にmkdir
失敗するテストを削除できます。~/xyz
mkdir ~/xyz &&
mv ~/foo ~/xyz/bar &&
mv ~/xyz ~/foo
答え2
cd /home/jjblack/foo
mkdir bar && mv * bar/