web-dev-qa-db-ja.com

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

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

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

9
Archit

ディレクトリ以外のすべてを$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に感謝)
12
Frxstrem

ファイルのみを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 \;
5
Emalsha Rasad

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
3

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

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

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

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

3
JoL

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))

Running Python File in Terminal を参照してください。

2
jfs

私は使用します

mv *.*

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

0
user669400