Проверьте, существует ли тот же файл в другом каталоге, используя Bash - PullRequest
0 голосов
/ 02 декабря 2018

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

Допустим, у меня есть путь / home / public / folder / (здесь у меня есть несколько файлов), и я хочу проверить, есть ли файлысуществует в / home / private / folder2

Я пробовал это

for file in $firstPath/*
do
   if [ -f $file ]; then
   (ask if to over write etc.. rest of the code) 

А также

for file in $firstPath/*
do
   if [ -f $file/$secondPath ]; then
   (ask if to over write etc.. rest of the code) 

Оба не работают;кажется, что в первом случае он сравнивает файлы по первому пути (поэтому он всегда спрашивает меня, хочу ли я перезаписать, хотя он не существует во втором пути), а во втором случае он не идет внутрьоператор if.Как я мог это исправить?

Ответы [ 2 ]

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

Это тоже работает

`[[ /home/public/folder/$file -ef  /home/private/folder2/$file ]] && echo "Same files" || echo "Not same"`
0 голосов
/ 02 декабря 2018

Если у вас есть такая конструкция, как for file in $firstPath/*, значение $file будет включать значение $firstPath, которого нет в $secondPath.Вам нужно обрезать путь, чтобы получить голое имя файла.

В традиционной оболочке POSIX каноническим способом сделать это был внешний инструмент под названием basename.Однако вы можете достичь того, что обычно считается эквивалентной функциональностью, используя Расширение параметра , таким образом:

for file in "$firstPath"/*; do
   if [[ -f "$secondPath/${file##*/}" ]]; then
       # file exists, do something
   fi
done

Бит ${file##*/} является важной частью здесь.Согласно документации, указанной выше, это означает, что «переменная $file исключает все до последнего /».Результат должен совпадать с тем, что выдает basename.

Как правило, вы должны заключать в кавычки ваши переменные в bash .Кроме того, рассмотрите возможность использования [[ вместо [, если вы на самом деле не пишете сценарии оболочки POSIX, которые должны быть переносимыми.Вам будет предоставлен более обширный набор тестов и более предсказуемая обработка переменных.Есть и другие различия .

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