У меня есть несколько файлов в папке с именем ***_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
.
Скажем, Вы находитесь в своем $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
, Очевидно, проверяют его на некоторых фиктивных данных сначала.
Я полагаю, что это точно делает то, что Вы описываете.
сценарий ниже кажется немного подробным, но большое участие его принято необходимой информацией, которую пользователь должен дать в этой несколько сложной конструкции.
Как всегда, скопируйте сценарий ниже, введите соответствующие пути, в этом случае довольно многие, соответствующие строки идентификации, и сохраните его как 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)
Создайте простой файл 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