現在のフォルダー内のファイルのみをサブフォルダーに移動するにはどうすればよいですか?


9

フォルダーを移動する必要はなく、ファイルを移動するだけです。

私は試しましたmv *が、このコマンドはフォルダも移動します。

回答:


13

あなたからのディレクトリ以外のすべてを移動したい場合$SOURCE_DIR$TARGET_DIRは、このコマンドを使用することができます。

find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +

詳細に説明:

  • find:ディレクトリ内のファイルの検索検索
  • $SOURCE_DIR:検索するディレクトリ
  • -maxdepth 1:サブディレクトリ内を調べない
  • -not -type d:ディレクトリを無視
    • -type f厳密にファイルであるものだけをコピーしたい場合にも使用できますが、ファイルでもディレクトリでもないすべてのもの(特にシンボリックリンク)もキャッチできるため、上記を優先します。
  • -exec mv -t "$TARGET_DIR" -- '{}' +:すべての一致するファイルがあるmv -t "$TARGET_DIR" -- FILES...場所でコマンドを実行しFILES...ます(@DavidFoersterに感謝)

2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +より安全であり($TARGET_DIRディレクトリがない場合、または一致がで始まる場合-)、より効率的です(一致したファイルごとに新しいサブプロセスを生成しないため)。
David Foerster 2017

@DavidFoersterありがとう、更新(今日も何か新しいことを学んだ!)
Frxstrem

5

ファイルだけをmv化したいと思います。まず、ディレクトリに移動してこのコマンドを使用し、$ TARGETをターゲットディレクトリパスに置き換えます。コピーしたい場合は、あなたのファイルが置き換えられmvcp

find . -type f -exec mv {} $TARGET \;

これを説明すると、find . -type fすべてのファイルを選択し、選択したすべてのアイテムに対してコマンドを-exec mv {} $TARGET \;実行することを意味しmvます。


以前の回答にはエラーがあります。mvサブディレクトリ内のすべてのファイルにもエラーがあります。クイックフィックスは使用-maxdepth 1です。次に、mvサブディレクトリ内のファイルを再帰的に行いません。以下は正しいものです。

find . -maxdepth 1 -type f -exec mv {} $TARGET \;

質問者はこれを望んでいないと思います!また、サブディレクトリ内のすべてのファイルを同じターゲットディレクトリに移動します。-type f再帰を防ぐことはできません。
Martin Thornton 2017

@MartinThorntonご提案ありがとうございます..私は私の答えを編集します...
Emalsha Rasad

3

Pythonアプローチ

ファイルを再帰的に処理する場合、それfindが方法です。この特定のケースでは必要ありませんが、-maxdepth 1他の回答が示すように使用できます。

単純なpythonコマンドでも同じことができます。次に例を示します。

$ tree
.
├── a_directory
└── a_file

$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];                                      
> map(lambda x:shutil.move(x,'./a_directory'),fl)"

$ tree
.
└── a_directory
    └── a_file

1 directory, 1 file

仕組み:

  • fl=[f for f in os.listdir('.') if os.path.isfile(f)]os.listdir('.')見つかったすべてのアイテムを反復処理し 、そのアイテムがos.path.isfile()関数を使用してファイルであるかどうかをテストします。

  • flファイルリストが作成されたら、map()関数を使用します。この関数は2つの引数を取ります-関数と項目のリストです。リスト内の各ファイルごとに指定した機能を実行します。したがって、ここではlambda x:shutil.move(x,'./a_directory')、指定されたファイルを指定されたディレクトリに移動する匿名関数がありfl、作成したファイルのリストがあります。

読みやすさと一般的な使用法のために、これを一般的なpythonスクリプトとして書き直すこともできます。これは、ソースディレクトリと宛先サブディレクトリの2つの引数を取ります。

#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv

# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ] 
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
     move(i,argv[2])

そして、使い方はそうです:

$ tree
.
├── a_directory
├── a_file
└── files2subdir.py

1 directory, 2 files

# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"                                                                                  

$ tree
.
├── a_directory
│   └── a_file
└── files2subdir.py

ここでは別だPythonのアプローチは
JFS

3

bashの代わりにzshを使用している場合、これを行うことができます。

mv "$SOURCE"/*(.) "$TARGET"

(.)最後には、グロブ修飾子と呼ばれています。.内部は、具体的にのみ、通常のファイルと一致することを意味します。

を行うことmv *(.) "$target"は迅速かつ実用的です。ただし、これをスクリプトの一部として行う場合は、代わりにFrxstremとDavid Foresterが提案したようなものを作成してmv -t "$target" -- *(.)、他の人の使用で発生する可能性のあるコーナーケースをより適切に処理することを検討してください。


1
David Foresterが私の答えで指摘したように、mv -t "$TARGET" -- "$SOURCE"/*(.)(ディレクトリで"$TARGET"始まる-かディレクトリでない場合)安全です。私はzshソリューションも好きです!
Frxstrem 2017

2

Pythonで、source-dirディレクトリ以外のすべてをディレクトリからディレクトリに移動するdestination-dirには:

#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path

if len(sys.argv) != 3:
    sys.exit(__doc__)  # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
    if not path.is_dir():
        shutil.move(str(path), str(dest_dir / path.name))

ターミナルでPythonファイル実行するを参照してください。


@SergiyKolodyazhnyy私はpep-8にそのような要件を見ていません、そして(そこの例によれば)それは実際には正反対です:import mypackagebeforefrom mypackage import ...
jfs

@SergiyKolodyazhnyyは、特殊なfrom __future__インポートと通常のfrom pathlibインポートを混同しないでください。
jfs 2017

ええ、私はその部分を誤って読んだようです。いいえ、そうです、import module最初(ライブラリおよびサードパーティのインポート)from module import objectが最後(ローカル/ライブラリ固有)である必要があります
Sergiy Kolodyazhnyy

0

私は使う

mv *.*

これは、フォルダーに拡張子がない限り機能します。

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