2016-07-13 2 views
1

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

Say есть 300 файлов, как показано ниже:

  1. Prefix_filename1_suffix1_date.txt - 100 файлов
  2. Prefix_filename101_suffix2_date.txt - 150 файлов
  3. Prefix_filename251_suffix3_date.txt - 50 файлов

Я бы только знать префикс и расположение файлов файлов в начале цикла:

cd folder_location 
for f in $(ls ${file_prefix}*); do 

Имена файлов будут известны мне после ввода цикла for - это одна из проблем.

Я использую регулярное выражение найти суффикс, общий для всех файлов, а затем использовать awk, чтобы получить имя файла между префиксом и суффиксом. Поэтому использовать regex и awk Мне нужны имена файлов для прохождения цикла for.

При обработке этих файлов я перемещаю все одинаковые файлы вместе, поэтому (если бы было три набора файлов) файлы можно было перемещать за 3 прогона (скажем, 1-го, 101-го и 251-го), а остальные 297 не делайте ничего, потому что нет файлов для обработки, потому что он перечисляет 300 файлов - изначально цикл запускается 300 раз.

Как этого избежать? И заставьте цикл работать всего 3 раза.

+0

Можете ли вы разместить свою петлю? –

+1

для f в $ (ls $ {file_prefix} *); do – zeushvk

+0

Я делаю cd folder_location перед циклом for – zeushvk

ответ

0

Предполагая, что имена файлов только те символы подчеркивания в местах, предоставленных, (не в префиксе, имени или суффикса), просто cut третьего поля, (т.е. суффикса), и sort -u , и у нас есть наши три суффикс es. Труба, которая соответствует петле, и mv соответствующие файлы к их ad hoc в подкаталогах.

cd folder_location 
echo ${file_prefix}*.txt | cut -d '_' -f 3 | sort -u | \ 
while read suffix ; do 
    [ -d ${suffix} ] || mkdir ${suffix} 
    mv ${file_prefix}*_${suffix}_*.txt ${suffix}/ 
done 
Смежные вопросы