Как я могу взять список строк и найти файлы, имя которых соответствует строке в списке? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть список из 600+ номеров и каталог из 50 000+ файлов.Все файлы названы так:

99574404682_0.jpg
99574404682_1.jpg
99574437307_0.gif
99574437307_1.gif
99574437307_2.gif
99574449752.jpg
99574457597.jpg
99581722007.gif

Я хочу скопировать любой файл с именем, совпадающим с номером в списке, до подчеркивания и скопировать в новый каталог.

Например, если мой список содержит:

99574404682
99574449752
99581722007

Тогда файлы:

99574404682_0.jpg
99574404682_1.jpg
99574449752.jpg
99581722007.gif

будут скопированы в новый каталог.Я на Mac с использованием Bash 3.2.Я думаю, что мне нужно использовать что-то вроде python, потому что список слишком велик для grep или find, но я не уверен.Спасибо!

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Вы можете использовать shutil.copy() для копирования ваших файлов из источника в место назначения.

from shutil import copy

from os import listdir
from os import makedirs

from os.path import abspath
from os.path import exists
from os.path import splitext

filenames = {'99574404682', '99574449752', '99581722007'}

src_path = # your files
dest_path = # where you want to put them

# make the destination if it doesn't exist
if not exists(dest_path):
    makedirs(dest_path)

# go over each file in src_path
for file in listdir(src_path):

    # If underscore in file
    if "_" in file:
        prefix, *_ = file.split("_")

    # otherwise treat as normal file
    else:
        prefix, _ = splitext(file)

    # only copy if prefix exist in above set
    if prefix in filenames:
        copy(abspath(file), dest_path)

В результате следующие файлы в dest_path:

99574404682_0.jpg  
99574404682_1.jpg  
99574449752.jpg  
99581722007.gif

Я не очень разбираюсь в bash, но вы можете попробовать что-то вроде этого:

#!/bin/bash

declare -a arr=("99574404682" "99574449752" "99581722007")

## Example directories, you can change these
src_path="$PWD/*"
dest_path="$PWD/src"

if [ ! -d "$dest_path" ]; then
    mkdir $dest_path
fi

for f1 in $src_path; do 
    filename=$(basename $f1)
    prefix="${filename%.*}"
    IFS='_' read -r -a array <<< $prefix

    for f2 in "${arr[@]}"; do
        if [ "${array[0]}" == "$f2" ]; then
            cp $f1 $dest_path
        fi
    done
done
0 голосов
/ 09 декабря 2018

с использованием модуля os и модуля shutil в python

import os
import shutil

, и вы можете подготовить список, содержащий шаблон совпадения, подобный

match_pattern=['99574404682','99574449752','99581722007']

, затем используйте os.listdir (), чтобы получитьсписок, который содержит имя файла в исходной директории

files_in_source_dir=os.listdir(source_directory_path)

при последней копии соответствующих файлов

for file in files_in_source_dir:
  if file.split('.')[0] in match_pattern: #using split('.')[0] to get filename without extend name
    shutil.copyfile(source_directory_path+file,target_directory_path+file)
0 голосов
/ 09 декабря 2018

Вы можете перебирать два списка, выбирая элемент из одного на основе условия startswith:

files_lst = ['99574404682_0.jpg', '99574404682_1.jpg', '99574437307_0.gif', '99574437307_1.gif', '99574437307_2.gif', '99574449752.jpg', '99574457597.jpg', '99581722007.gif']

lst = [99574404682, 99574449752, 99581722007]

for x in files_lst:
    for y in lst:
        if x.startswith(str(y)):
            print(x)

# 99574404682_0.jpg
# 99574404682_1.jpg
# 99574449752.jpg
# 99581722007.gif

Получает все файлы, которые начинаются с чисел, указанных в lst.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...