Узнайте, действительно ли папка в моем списке существует в моей папке - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь выяснить, действительно ли на моем диске в myFiles есть папка из моего list.txt. Но единственный вывод, который я получаю, это " Совпадение не найдено ", это bs, потому что я знаю, что некоторые из этих папок реальны. Я считаю, что что-то не так с условием Если , но я не знаю, что.

Кстати, переменная fileFolder должна быть в кавычках, в противном случае я получаю " ожидаемую унарную операцию ».

Эта команда find myFiles/ -name $fileList -printf '%f\n' обрезает путь к папке, поэтому вместо / home / michael / myFiles / folder_1 я получаю только folder_1.

Содержимое list.txt:

папка_1 папка_2 папка_3 папка_4

Содержимое папки myFiles:

папка_1 папка_3 папка_5 папка_6

В любом случае, спасибо за ваши ответы и время.

#!/bin/bash

for i in $(cat list.txt);do
    fileList=`echo $i`
    fileFolder=`find myFiles/ -name $fileList -printf '%f\n'`
    if [ $fileList == "$fileFolder" ]; then
        echo "Found match $fileFolder"
    else
        echo "No match found"
    fi
done

ОБНОВЛЕНИЕ: я забыл упомянуть, что я запускаю этот скрипт на Ubuntu под Win10. Итак, я протестировал мой скрипт на виртуальной машине, и он прекрасно работает :) Но мне нужно, чтобы он работал на Ubuntu, работающем под Win10: /

ОБНОВЛЕНИЕ 2: Я запускаю свой скрипт с bash -x и это пример того, что я получаю

++ cat list.txt
+ for i in $(cat list.txt)
++ echo $'Folder_1\r'
+ fileList=$'Folder_1\r' 
+ echo $'Folder_1\r'
Folder_1
++ find myFiles/ -name $'Folder_1\r' -printf '%f\n'
+ fileFolder=
+ '[' $'Folder_1\r' == '' ']'
+ echo 'No match found'
No match found

Я думаю, что это проблема: fileList = $ 'Folder_1 \ r'. Не должно быть этой части -> \ r

РЕШЕНО: Я загрузил dos2 unix a ran dos2 unix list.txt в командной строке. Скрипт наконец работает. Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Для каждого ввода из OP в файле есть windows окончания строк. Запустите dos2 unix или заново создайте файл на Linux, используя vi / enacts на Linux, чтобы решить проблему.

0 голосов
/ 29 апреля 2020

Вот альтернативный скрипт, который может делать то, что вы хотите, и он не использует cat и for loop, но while read loop

#!/usr/bin/env bash

##: Loop through the output of find
while IFS= read -ru 5 -d '' directories; do
  while IFS=$' \r\t\n' read -r list; do  ##: Loop through the output of list.txt
    if [[ $directories = *"$list" ]]; then  ##: If both match
     printf 'Found match directory %s is %s in %s\n' "$directories" "$list" list.xt ##: Print a message that the match
    fi
  done < list.txt
done 5< <(find myFiles/ -type d -print0) ##: -print0 to delimit with null bytes

РЕДАКТИРОВАТЬ: Изменить значение IFS для чтения файла в IFS=$' \r\t\n' для соответствия возврату каретки из файла.

Предполагается, что list.txt имеет одну запись в строке, а не одну строку.

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