2015-02-07 3 views
0

Мне нужно искать 2 dirs для пары файлов с одинаковыми tittles (но не с расширениями!) И объединить их заголовки в рамках некоторой новой команды.При поиске пар одинаковых файлов

первый, как напечатать только название файлов

1) Обычно я использую следующую команду в для цикла, чтобы выбрать полное имя файла, который петельные

for file in ./files/* do; 
title=$(base name "file") 
print title 
done 

Что я должен изменить в приведенном выше сценарии для печати в качестве названия только имени файла, но не его расширения?

2) как его можно добавить условие, чтобы проверить, есть ли два файла одни и те же имена, выполняя двойной цикл над ними е г

# counter for the detected equal files 
i=0 
for file in ./files1/* do; 
title=$(base name "file") #change it to avoid extension within the title 
for file2 in ./files2/* do; 
title2=$(basename "file2") #change it to avoid extension within the title2 
if title1==title2 
echo $title1 and $title2 'has been found!' 
i=i+1 

сделано

Спасибо за помощь! Глеб

+0

Посмотрите на http://www.shellcheck.net/ – Cyrus

ответ

1

Вы могли бы начать с исправлением ошибок синтаксиса в вашем сценарии, такие как do следует ;, когда оно должно быть наоборот.

Затем оболочка имеет операторы для удаления вложенных строк с самого начала (##, #) и конец (%%, %) в переменной. Вот как список файлов без расширений, то есть удаление кратчайшей части, которая соответствует Glob .* с правой стороны:

for file in *; do 
    printf '%s\n' "${file%.*}" 
done 

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

Не верьте, что кто-то говорит вам использовать уродливые и дорогие трубопроводы и разветвляющие с basename, cut, awk и т. Д. Это все излишне.

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

$ find files1 files2 
files1 
files1/file1.x 
files1/file3.z 
files1/file2.y 
files2 
files2/file1.x 
files2/file4.b 
files2/file3.a 

Теперь создайте два списка имен файлов, расширений раздели:

ls files1 | sed -e 's/\.[^.]*$//' | sort > f1 
ls files2 | sed -e 's/\.[^.]*$//' | sort > f2 

The comm коммунальные тесты для линий общего в двух файлах:

$ comm f1 f2 
       file1 
file2 
       file3 
     file4 

В первом столбце перечислены строки только в f1, второй только в f2 и третий общий для обоих. С помощью параметров -1-2-3 вы можете подавлять нежелательные столбцы. Если вам нужно рассчитывать только общие файлы (третья колонка), запустить

$ comm -1 -2 f1 f2 | wc -l 
     2 
+0

спасибо за идею! и возможно ли связать заголовок файла, созданного вашим шаблоном, с некоторой новой переменной, связанной точно с файлом в папке (например, как именно это имя)? Мне нужно сопоставить имена на следующем шаге с файлами с одинаковыми именами, но разными расширениями из другого каталога, чтобы найти пары с одинаковыми титлетами.Не могли бы вы показать пример того, как это можно сделать, используя мою идею с вложенным циклом? На самом деле я не программист вообще, просто использую оболочку, чтобы облегчить анализ некоторых научных данных :) Спасибо! – user3470313

+0

@ user3470313 Если бы эта немного другая идея обеспечила тот же ответ: 1) Для каждого из двух каталогов создайте отсортированный список файлов без расширений. 2) Сравните списки файлов, сообщая для каждого файла «Только в списке 1», «Только в списке 2», «Есть ли в обоих списках»? – Jens

+0

Звучит неплохо, но я не знаю, как сделать списки в оболочке, только сделал это в python :) Поэтому я буду благодарен за пример скрипта, который будет: 1) создавать новую переменную для каждого файла цикла, связанного с его именем без расширения или, альтернативно, поместить имя в список 2) сравнить элементы из двух списков. Благодаря! Глеб – user3470313

Смежные вопросы