回答:
あなたからのディレクトリ以外のすべてを移動したい場合$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に感謝)ファイルだけをmv化したいと思います。まず、ディレクトリに移動してこのコマンドを使用し、$ TARGETをターゲットディレクトリパスに置き換えます。コピーしたい場合は、あなたのファイルが置き換えられmv
てcp
。
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
再帰を防ぐことはできません。
ファイルを再帰的に処理する場合、それ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
bashの代わりにzshを使用している場合、これを行うことができます。
mv "$SOURCE"/*(.) "$TARGET"
(.)
最後には、グロブ修飾子と呼ばれています。.
内部は、具体的にのみ、通常のファイルと一致することを意味します。
を行うことmv *(.) "$target"
は迅速かつ実用的です。ただし、これをスクリプトの一部として行う場合は、代わりにFrxstremとDavid Foresterが提案したようなものを作成してmv -t "$target" -- *(.)
、他の人の使用で発生する可能性のあるコーナーケースをより適切に処理することを検討してください。
mv -t "$TARGET" -- "$SOURCE"/*(.)
(ディレクトリで"$TARGET"
始まる-
かディレクトリでない場合)安全です。私はzshソリューションも好きです!
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ファイルを実行するを参照してください。
import mypackage
beforefrom mypackage import ...
from __future__
インポートと通常のfrom pathlib
インポートを混同しないでください。
import module
最初(ライブラリおよびサードパーティのインポート)from module import object
が最後(ローカル/ライブラリ固有)である必要があります
私は使う
mv *.*
これは、フォルダーに拡張子がない限り機能します。
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
より安全であり($TARGET_DIR
ディレクトリがない場合、または一致がで始まる場合-
)、より効率的です(一致したファイルごとに新しいサブプロセスを生成しないため)。