現在のフォルダー内のすべてのファイルをサブフォルダーに移動する方法は?


70

私はパスにいます:

/myuser/downloads/

そして、私はサブフォルダを作成します:

/myuser/downloads/new

次に、ダウンロードフォルダー内のすべてのファイルとフォルダー/サブフォルダーをサブフォルダーに移動します。

これどうやってするの?

私は試した:

mv -R *.* new/

しかし、移動には-Rスイッチは必要ないようです。


4
-Rは必要ありません。ただmv * new、「新しいものから新しいものへと移動することはできません」またはそれに似たものが鳴ります。おそらくmv -i * newあなたは上書きを防ぎます。

回答:


101

コマンド

mv !(new) new

トリックを行う必要があります。動作しない場合は、shopt -s extglob最初に実行してください。

また、隠しファイル/ディレクトリ(ドットで始まるもの)を移動するには、shopt -s dotglob最初に実行します。
したがって、要約すると:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

dotglob悪い驚きを避けるために設定を解除する方が常に良いです)。


5
の意味は!(something)何ですか?
アディアライク

2
@adeerは単にnot(何か)と言っています。つまり、すべてではなく、すべてをコピーします。泥だらけ?
ロッキーマウンテンハイ

4
非常に。zshに相当するものを知っていますか?
アデリーライク

1
取得できません。たとえば、フォルダのコンテンツをdev現在の場所に移動しようとすると、実行する必要がありますmv !(dev) devか?私が得る-bash: !: event not found
ブラック

5
@adeerは非常に似ています。setopt extendedglobzshで拡張グロブモードを設定します。^は除外記号であるためmv ^new new、トリックも行います。そして、あなたが使用できるのzshに設定されたすべてのオプションを確認しsetopt、あなたが行うことができ、拡張グロブモードを無効にするにはunsetopt extendedglob
ミスターT

10

私はこのようなものを見つけましたが、理解するのが少し簡単で、あなたにとってもうまくいくかもしれません:

ls | grep -v new | xargs mv -t new

上記のソリューションに説明を追加します。

マニュアルページから:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

ステップごとに説明:

  • ls 現在のディレクトリ内のファイルをリストします
  • grep -v new パイプされたものを返しますnew
  • xargs mv -t newパイプされたファイルをgrep -vターゲットディレクトリに移動します

私はこの方法を試しましたが、次のようになりました:mv: illegal option -- t。これは私が使用しているからzshですか?
ConstantFun

@ConstantFunそれはzshかもしれませんが、それはあなたの実装だと思いますmv(mvのバージョンは私が使用していたものとは異なることを意味します)あなたは何のOSを使用していますか?この答えを書いたとき、Linuxディストリビューションcentosを使用していたと思いbashます。
lockwobr

2
osxでこれをテストするだけmv: illegal option -- tで、osxのmvには-tオプションがないため、同じエラーが発生します。
lockwobr

1
(私はこれを試していないので、計画していません。)このリンクapple.stackexchange.com/questions/69223/…は、gnu core cli utilsを入手するのに役立つgnucoreのインストール方法を説明しています。osxbsdに同梱されています。Linuxに付属しているものとは異なるCLIツール。
lockwobr

私はOSXを実行zshしていますので、おそらくOSです。明確にしてくれてありがとう!
ConstantFun

7

シンプルなアイデア。/ myuserにいると仮定して、downloadsの名前をnewに変更し、新しいダウンロードディレクトリを作成してから、そこに新規に移動します。

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

フォルダーからすべてのファイルをそのサブフォルダーの1つに移動する場合は、次のコマンドを使用できます。

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

すべてのファイルを検索し、それらをサブフォルダーに移動します。

@waltinator:の-type d -name 'new' -pruneトラバーサルを防ぐために追加されました/myuser/downloads/new


私は名前のサブディレクトリを作成newし、このコマンドを試してみました、私が手にmv: missing file operandしてTry 'mv --help' for more information
mook765

1

この代替プロセスを試すことができます-パスに留まる

/myuser/downloads/

しかし、代わりに、最初に作成する/myuser/downloads/new/ディレクトリを、代わりにフォルダを作成する/myuser/コマンドで、ディレクトリmkdir ../new、その後にすべてのファイルを移動downloadsするnewと、最終的には移動newdownloads/myuser/downloads/次のコマンドを使用して、パス内で1行でこれを実行できます。

mkdir ../new && mv * ../new && mv ../new ../downloads

この場合、newのパスと同じレベルにあるため、ファイル/フォルダーの「フィルタリング」を心配する必要はありません。downloadsすべてをdownloadsに移動してからnewnewダウンロードに移動することができます。

しかし、あなたはすでにサブフォルダが持っている場合newに作成され、心配しないで、別のものを作成する必要はありません-ちょうど変更mkdir最初の左側にあるコマンド&&に上記のコマンドでmv押して、コマンドをnewにアップ道; あなたがまだいる間、つまり、/myuser/downloads/あなたが変更することができますmkdir ../newmv new ..。次に、new[パス内の/myuser/downloads/new/] サブフォルダー/myuser/new/がと同じレベルでにプッシュされ、/myuser/downloads/上記のように残りのコマンドを実行できます。すべて一緒に、パスから始めます/myuser/downloads/

mv new .. && mv * ../new && mv ../new ../downloads

そして、「ダウンロードフォルダー内のすべてのファイルとフォルダー/サブフォルダーをサブフォルダー[ new]に移動する」ことを望んでいたので、完了です!あなたは、移動したいと考えていました場合にのみ、ファイル(または唯一のフォルダをまたは[全粒状物の動きを挿入])、その後、次のようなことができ、「フィルタ」のオブジェクト、他のコマンドを使用する必要があると思いますgrep。ただし、上記のコマンドで十分です。

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