web-dev-qa-db-ja.com

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

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

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

ただし、移動しようとするため、明らかに機能しませんnew_directoryからnew_directory。そのディレクトリ内のすべてのファイルとディレクトリをコピーして貼り付ける必要なしに、1行でやりたいことを簡単に行う方法はありますか?

14
Rory

きみの

mv * ./new_directory
18
mibus

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

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

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

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

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

8
Cian

私がこの問題を経験したとき、私は次のいずれかを実行しました。

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

または

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

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

6
Kenster

何について:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW、内容を新しいディレクトリに移動せず、このディレクトリを新しいディレクトリ内に配置してください。

2
Javier

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

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

これは、システムにfindが存在しない場合でも、100%移植可能でなければなりません。

1
warren

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

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コマンドを作成します。
1
Niels Basjes

使用する:

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

xargs manページから:

-P max-procs

  Run up to max-procs processes at a time;
1