ディレクトリ内のすべてのファイルをそのディレクトリに移動するBashスニペット


14

たくさんのファイルとディレクトリが入ったディレクトリがあります。それを整理するために、これらのファイルをすべてディレクトリに入れるので、次のようにします。

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory

それが移動しようとするでしょうしかし、明らかに動作しないことnew_directorynew_directory。そのディレクトリ内のすべてのファイルとディレクトリをコピーして貼り付けることなく、1行で必要なことを行う簡単な方法はありますか?


3
動作しますが、new_directoryをそれ自体に移動できないというエラーメッセージを出力するだけです。
cas

回答:


18

きみの

mv * ./new_directory
コマンドは実際に機能します。そのディレクトリをそれ自体に移動できないという警告を出力するだけです。


これに関する「唯一の」問題は、コマンドの全体の展開が長すぎる場合(つまり、ファイルが多すぎる場合、名前が長すぎる場合)、これが機能しなくなることです。
ニールズバスジェス

副次的な注意事項として、これを行うgit mv場合は、-kフラグを使用する必要があります。これは、gitが警告を発するだけでなくデフォルトで失敗するためです。だからあなたがする必要がありますgit mv -k * ./new_dir
ユヴァルA

11

速くて汚いワンライナー。

mv `ls -A | grep -v new_directory` ./new_directory

1
動作しません:プレーンlsはドットファイルを表示しません。
wzzrd

非常に良い点。-aでそれを修正しました。

2
したがって、new_directoryをそれ自体にmvしようとする代わりに(元の質問)、今移動しようとしています。および..をnew_directoryに入れます。
ニールズバスジェス

2
フィードバックをありがとうNiels。を削除するアッパーaで修正しました。および..ディレクトリ一覧から。

8

ファイル(ディレクトリではない)を探している場合は、

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;

最もポータブルなソリューションです。速度を上げるために、-print0と-0を使用してfindとxargsを移動する必要がありますが、GNU findとxargsがある場合のみです。


3
かなり最近のGNU findを使用して、\の代わりに\ +を使用することもできます。作成するmvの数を減らすため。
wzzrd

GNU findがある場合は、xargsを使用することもできます。xargsは同じことを行い、-pフラグを使用して複数のmvを同時に実行できます。
シアン

のクールな使用find-私は間違いなく、それを持っていないシステムに行ってきましたが、悲しいことに:(
warren

本当に?findは(afaik)SUSで指定されているため、すべてが必要です。唯一の問題は、GNU find(多くの便利なオプションがある)か、通常の検索かです。
シアン


6

この問題が発生したとき、次のいずれかを実行しました。

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .

または

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory

2番目の形式は、「。」で始まるファイル名をスキップするワイルドカードを利用します。


ワイルドカードでスキップされたドット付きファイルを忘れました。念押し有難う !:)
エモンジェ

2

どうですか:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW、コンテンツを新しいディレクトリに移動せずに、このディレクトリを新しいディレクトリ内に配置します。


1

@ Rembraneの答えと同様の方法で(1ライナーではありませんが):

for FN in *
do
    if [ "<new_dir>" != $FN ] then
        mv $FN <new_dir>
done

これは100%ポータブルである必要があります- find残念ながらシステムに存在しない場合でも


単一のUNIX仕様ではfindが必要です。このように、決して存在するべきではありません(それを使って何かを構築できなかったというわけではありません。しかし、恐ろしい努力を必要とし、ベンダーシステムはそれを
欠か

多分それはfindutilsまたはその同等物をyoinkするいくつかのハイパーパラノイドシステム管理者ですか?確かではありませんが、私はそれを持っていないボクセンに遭遇したことを知っています:(
ウォーレン

1

私の提案:他の人が述べたように

mv * ./new_directory

合計拡張が十分に短いIFFを見つけて動作します。

それ以外の場合は、はるかに多くの数のファイルにスケーリングするこの1つを試すことができます。

find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory

説明

  1. すべてのファイルをリストします。
  2. すべてのファイル名を最大100000文字のチャンクにグループ化します。
  3. チャンクごとに1つのmvコマンドを作成します。

休憩はあなたのファイル名には、スペースを持っている場合
Cian

あなたが正しい。そのため、修正するには-print0フラグと-0フラグを追加する必要があります。
ニールズバスジェス

私が試した-print0し、-0それはまだ休憩。
クリスチャン・シウピトゥ

find:警告:非オプション引数-typeの後に-maxdepthオプションを指定しましたが、オプションは定位置ではありません(-maxdepthは、前に指定したテストとその後に指定したテストに影響します)。他の引数の前にオプションを指定してください。
クリスチャン・シウピトゥ

1

使用する:

find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
    xargs -0 -P 100 -I'{}' mv '{}' new_directory

xargsmanページから:

-P max-procs

  Run up to max-procs processes at a time;

-1

エラーメッセージを回避し、シンプルに保つには:

mv *.* ./new_Folder

同じことを行いますが、エラーメッセージを回避します(フォルダ名にドットが含まれていない限り)。

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