web-dev-qa-db-ja.com

コマンドラインを使用して何百ものフォルダーを結合する方法

535個のフォルダー(recup_dir.1recup_dir.2、...、recup_dir.535)があり、それらのフォルダーの内容を1つのフォルダーにマージ(結合)したい名前はrecup_dir)。一部のファイルは同じ名前(img.jpgなど)を持っている可能性があり、既存のファイルを上書きしないでください(代わりにimg1.jpgimg2.jpgなどのように名前を変更する必要があります...) 。

コマンドラインを使用してそのようなことを行う方法はありますか?

2

以下のスクリプトは、535フォルダを含む1つのディレクトリからすべてのファイルを(再帰的に)別の(単一の)ディレクトリに移動し、元のファイル名を保持します。

重複の場合

(のみ)名前が重複している場合、ファイルの名前はduplicate_1_[filename]duplicate_2_[filename]などに変更されます。

使い方

以下のスクリプトを空のファイルにコピーし、rearrange.pyとして保存し、ソースと宛先(ディレクトリ)への正しいパスを設定し、それを実行します:

python rearrange.py

スクリプト:

#!/usr/bin/env python

import os
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/sourcedirectory"
target_dir = "/path/to/destination" 
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        n = 1; name_orig = name
        while os.path.exists(target_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
        newfile = target_dir+"/"+name; shutil.move(subject, newfile)

(gnome-)ターミナル-「ドラッグアンドドロップ」機能の場合:

以下のバージョンを使用し、上記の説明に従って保存します(ただし、何も変更しないでください)。実行可能にします。それを使用するには、ターミナルウィンドウを開き、スクリプトをターミナルウィンドウにドラッグしてから、ソースディレクトリ、最後にドラッグします。ターミナルに表示されるコマンド:

rearrange.py /path/to/source /path/to/destination

Returnキーを押すと完了です。

スクリプト:

#!/usr/bin/env python

import os
import shutil
import sys
# --------------------------------------------------------
reorg_dir = sys.argv[1]
target_dir = sys.argv[2]
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        n = 1; name_orig = name
        while os.path.exists(target_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
        newfile = target_dir+"/"+name; shutil.move(subject, newfile)

移動ではなくコピー

現在のディレクトリを変更せずにcopyだけを新しいディレクトリに保存したい場合は、最後の(セクションの)行を置き換えるだけです:

交換:

shutil.move(subject, newfile)

沿って:

shutil.copy(subject, newfile)
4
Jacob Vlijm

Sudo cp -r --backup=t recup_dir.*/* recup_dir

このコマンドは、すべての535フォルダーの内容をrecup_dirにコピーし、既存のファイルの名前をfile.~1~ file.~2~ ..に変更します

535フォルダとその内容はまだ存在します。コピー後に削除したい場合は、最初のコマンドの後に&& Sudo rm -rf recup_dir.*を追加するだけなので、次のようになります。

Sudo cp -r --backup=t recup_dir.*/* recup_dir && Sudo rm -rf recup_dir.

3
younes zeboudj