Поиск файлов, которые соответствуют другому имени файла в другой папке

У меня есть несколько файлов в папке с именем ***_code_c**** (где * представляет любую букву или цифру). У меня есть другая папка, в которой много файлов, папок и подпапок. Что я хочу сделать, так это искать и копировать в другое место любые файлы, которые соответствуют именам этих файлов, например ***_code_c****, но только с двумя разными буквами, такими как ***_mode_m**** и ***_kode_c****, и любые файлы, соответствующие этому. критерии будут скопированы в определенные папки, где те, которые имеют mode вместо code, будут помещены в папку, а те, которые имеют kode вместо code, будут помещены в другую папку. Если кто-нибудь может, пожалуйста, посоветуйте, как это можно сделать. Спасибо

Пример, чтобы уточнить, что нужно сделать:

FolderA содержит несколько файлов, скажем, ABC_code_c001, CDE_code_c002, FGH_code_c003 ...

В другом FolderB много файлов, папок и подпапок.

для каждого файла в FolderA есть соответствующие два файла в FolderB, которые названы точно так же, за исключением средней части. Например, соответствующие два файла ABC_code_c001 - это ABC_kode_c001 и ABC_mode_m001, а соответствующие файлы FGH_code_c003 - это FGH_kode_c003 и FGH_mode_m003 и т. Д.

Итак, что я хочу Для этого нужно взять каждый файл в FolderA и найти два соответствующих файла в FolderB, а затем скопировать каждый из этих двух файлов в две другие папки, скажем, FolderC и FolderD (по одному в каждой).

Обратите внимание, что имена, которые я использую, не являются точными именами, которые я перечислил в примере, но они имеют ту же идею, где разница между его именем и двумя другими именами будет одной буквой посередине от c - k и m.

2
задан 29 September 2014 в 01:10

3 ответа

Скажем, Вы находитесь в своем $HOME, и у Вас есть четыре каталога - folderA и folderB, как в Вашем вопросе; folderK, где Вы хотите переместить 'kode' файлы в; и folderM, где Вы хотите переместить свои папки 'режима' в. Следующее должно выполнить это:

shopt -s globstar
cd /path/to/folderA
for f in *_code_c*; do
  mv /path/to/folderB/**/"${f/code/kode}" /path/to/folderK
  mv /path/to/folderB/**/"${f/code_c/mode_m}" /path/to/folderM
done

, Очевидно, проверяют его на некоторых фиктивных данных сначала.

0
ответ дан 29 September 2014 в 01:10

Я полагаю, что это точно делает то, что Вы описываете.

сценарий ниже кажется немного подробным, но большое участие его принято необходимой информацией, которую пользователь должен дать в этой несколько сложной конструкции.

, Как использовать

Как всегда, скопируйте сценарий ниже, введите соответствующие пути, в этом случае довольно многие, соответствующие строки идентификации, и сохраните его как reorg.py.

Выполнение это командой:

python3 /path/to/reorg.py

сценарий

#!/usr/bin/env python3

import os
import shutil

# --------------------------------------------------------
# existing files directories
original_dir = "/path/to/original_files"
equals_dir = "/path/to/files_with_name_variants"
# original identifying string
id_string = "code" 
# variants + their desired destination
var_1 = "node"; vardir_1 = "/path/to/directory/where_first_variants_shouldbestored"
var_2 = "kode"; vardir_2 = "/path/to/directory/where_second_variants_shouldbestored"

# ---------------------------------------------------------

origs = []

for root, dirs, files in os.walk(original_dir):
    for name in files:
        if id_string in name:
            origs.append(name.replace(id_string, ""))

for root, dirs, files in os.walk(equals_dir):
    for name in files:
        if var_1 in name:
            if name.replace(var_1, "") in origs:
                shutil.copyfile(root+"/"+name, vardir_1+"/"+name)
        if var_2 in name:
            if name.replace(var_2, "") in origs:
                shutil.copyfile(root+"/"+name, vardir_2+"/"+name)
0
ответ дан 29 September 2014 в 01:10

Создайте простой файл copyFile.sh следующим образом:

#!/bin/bash
kodeFile=$(basename $1 | sed -e 's/_code_c/_kode_c/')
modeFile=$(basename $1 | sed -e 's/_code_c/_mode_m/')
find FolderB -name "$modeFile" -exec cp {} FolderC/$modeFile \;
find FolderB -name "$kodeFile" -exec cp {} folderD/$kodeFile \;

сохраняют его, например, в/home/yourUser/bin.

разрешение Изменения к copyFile.sh:

chmod +x /home/yourUser/bin/copyFile.sh

Открытый Вы /home/yourUser/.bashrc файл и добавляют в конце эту строку:

PATH=$PATH:/home/yourUser/bin

сохраняют его и перезагружают его:

source .bashrc

Теперь у Вас есть новая утилита, которые ищут файл и копируют их.

Попытка это:

find FolderA -name "*_code_c*" -exec copyFile.sh {} \;

Протестированный на lubuntu 12.04

0
ответ дан 29 September 2014 в 01:10

Другие вопросы по тегам:

Похожие вопросы: