web-dev-qa-db-ja.com

親フォルダの名前をファイル名に追加して、複数のディレクトリからファイルをコピーする方法は?

「複数のディレクトリから1つのディレクトリにファイルをコピーする」ことについて考えられるすべての回答を探してきましたが、答えが見つかりません。私のデータベースの取り扱いには、もう少し具体的なものが必要です。

同様の質問があります:

複数のディレクトリから別の複数のディレクトリへのファイルのコピー

しかし、どのディレクトリからコピーされたかを認識できるように、これらのファイル(すべて同じ名前)を新しいディレクトリにコピーして親ディレクトリ名を追加するにはどうすればよいですか?

はい、私はそれらの100個を持っていなかった場合、私は名前を次々にコピーして名前を変更することができました

Findでループを試しました。など、それでも、コピーしたファイルを親ディレクトリ名に追加できません。

私はこの分野でまだ若いので、正規表現から始めています。ここで何かやるべきことがあると思いますが、どの程度正確かはわかりません。

だから、これはグラフィカルに私の質問です。私のUNIX端末で簡単なコマンドまたはループを使用してそれを行う方法:

DIR_a1 --> output_file.bam
DIR_a2 --> output_file.bam                              
DIR_a3 --> output_file.bam  

すべてコピーoutput_files.bam in NEWDIR_outputで、親ディレクトリ名とともに表示されます。

output_file_a1.bam
output_file_a2.bam                              
output_file_a3.bam

事前に、どんな入力にも非常に感謝しています

1
Marylaure

ファイルをソースからターゲットディレクトリにコピーし、包含フォルダーの名前をファイルに追加する

以下のスクリプトは、ファイルを再帰的にソースディレクトリからflatディレクトリにコピーし、(直接)上位ディレクトリの名前をファイル名に追加します。ディレクトリの名前が挿入されますファイルの可能な拡張子、例とまったく同じです。

スクリプト

#!/usr/bin/env python3
import os
import sys
import shutil

for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        # split off the superior directory's name
        dirname = root.split("/")[-1]
        # define file+path, possible extension position
        src = os.path.join(root, f); spl = f.rfind(".")
        # defining new filename
        newname = f[:spl]+"_"+dirname + f[spl:] if spl != -1 else f+"_"+dirname
        # copy the file into the new directory
        shutil.copyfile(src, os.path.join(sys.argv[2], newname))

使い方

  1. スクリプトintyoを空のファイルにコピーし、copyandrename.pyとして保存します
  2. ソースおよびターゲットディレクトリを引数として実行します。

    python3 /path/to/copyandrename.py <source_directory> <target_directory>
    

    私のテストコマンドは、例えば.

    python3 '/home/jacob/Bureaublad/pscript_4.py' '/home/jacob/Bureaublad/testmap' '/home/jacob/Bureaublad/target'
    

いつものように、最初にサンプルでテストしてください!

2
Jacob Vlijm

シェルのパラメーター置換機能を使用してこれを行うことができるはずです。

$ for d in DIR_a*; do echo cp -- "$d/output_file.bam" "NEWDIR_OUTPUT/output_file${d#DIR}.bam"; done
cp DIR_a1/output_file.bam NEWDIR_OUTPUT/output_file_a1.bam
cp DIR_a2/output_file.bam NEWDIR_OUTPUT/output_file_a2.bam
cp DIR_a3/output_file.bam NEWDIR_OUTPUT/output_file_a3.bam

正しいことを実行していることを確認したら、echoを削除します。

2
steeldriver