Копирование определенных файлов путем частичного совпадения их имен со списком в текстовом файле

У меня есть каталог с файлами со строковыми именами, которые начинаются с 5 чисел (т.е. 12345_a_b, 23456_s_a), и у меня есть текстовый файл в том же каталоге, который имеет список имен файлов, указанных таким же образом, однако только числа совпадают, и ничто после подчеркивания (т.е. 12345_q_p, 23456_p_l). Я хочу скопировать файлы в текущем каталоге в новый, но только те, где первые 5 чисел в имени файла соответствуют первым 5 номерам каждого имени файла в текстовом файле, игнорируя все, что происходит после. Кажется, я могу использовать xargs, но я не уверен, как совместить имена частично. Может ли кто-нибудь помочь?

1
задан 26 January 2017 в 14:14

2 ответа

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

#!/bin/bash
source_dir=/directory/containing/files
target_dir=/new/directory
list=/full/path/to/number_list
reg='^[0-9]{5}$' 

while IFS= read -r line; do
   line=${line:0:5}
   [[ "$line" =~ $reg ]] && cp -t "$target_dir" "$source_dir"/"$line"* 2>/dev/null
done < "$list"
Команда read будет читать ваши файл по строкам, устанавливая содержимое каждой строки в переменную 'line'. Команда cp использует -t для установки цели для копирования файлов, а шаблон glob "$source_dir"/"$line"* найдет любые файлы в исходном каталоге, которые начинаются с числового значения в переменной строки. Цикл while означает, что команды read и cp выполняются для каждой строки файла списка. IFS= означает, что если в вашем файле списка есть пробелы, они будут включены в строку поиска, это не обязательно необходимо в этом примере, но полезно, когда вы хотите читать файл по строкам.
2
ответ дан 23 May 2018 в 02:03
  • 1
    Спасибо за очень разумные предложения @RoVo, взятые на борт. – Arronical 26 January 2017 в 14:47

Запустите цикл в ваших файлах. Внутри цикла выясните, совпадают ли имена файлов с именами файлов в вашем текстовом файле, используя grep.

Используя -q, вы можете использовать && cp, если он что-то найдет.

#!/bin/bash
while IFS= read -r file; do
  grep -Eq "^${f:0:5}" your_text_file && cp ${file} /path/to/destination/
done <( (find . -type f -regex "^[0-9]{5}.*")
[d2 ] Это будет иметь некоторые накладные расходы, когда у вас огромное количество файлов. Но может использоваться и для более сложных задач ...

1
ответ дан 23 May 2018 в 02:03

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

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