Попытка получить скрипт в консоли Linux, чтобы показать дублирующие имена файлов вместо ошибки

Вы можете использовать netstat -tnlp для вывода списка всех открытых портов TCP. netstat -tunlp для вывода списка портов TCP и UDP.

-1
05.11.2018, 10:34
1 ответ

Не зацикливать вывод find. Это неэлегантно (цикл не начнет свою первую итерацию, пока не будут найдены все пути )и опасно (найденные пути будут разбиты на пробелы, табуляции и новые строки, и оболочка также попытается их расширить как шаблоны подстановки имен файлов ).

Вместо этого (все это предполагает, что вы не хотите копировать найденные файлы, если есть конфликт имен):

find fs282/mirror -type f -iname '*.jpeg' -exec sh -c '
    for pathname do
        if [ -e "jpegs/${pathname##*/}" ]; then
            printf "%s\n" "${pathname##*/}"
        else
            cp "$pathname" jpegs/
        fi
    done' sh {} + | sort -u

Здесь используется findв качестве генератора пути для скрипта в строке -. findпередаст скрипту найденные пути, и он будет перебирать их с каждым путем в $pathname. Сценарий проверяет, существует ли компонент имени файла пути в каталоге jpegs, и если это так, он печатает имя файла в конце пути в стандартный вывод. Если имя файла не существует в jpegs, он копирует файл.

Замена параметра ${pathname##*/}удаляет все, начиная с начала $pathnameдо последнего символа /включительно.], оставляя только компонент имени файла в конце.

sort -uв конце возьмет все имена файлов, напечатанные строковым сценарием -, и отсортирует их, удаляя дубликаты.

Другой подход:

find fs282/mirror -type f -iname '*.jpeg' \
    ! -exec sh -c '[ -e "jpegs/${1##*/}" ] && printf "%s\n" "${1##*/}"' sh {} ';' \
    -exec cp {} jpegs ';' | sort -u

Это, по существу, одно и то же, но сформулировано совершенно иначе.

С помощью короткого скрипта в строке -проверяется, существует ли имя файла под jpegs, и если да, то имя файла печатается (, а затем сортируется )и findпродолжается со следующей файл. Если он не существует, файл копируется.

Связанные:

1
28.01.2020, 05:08

Теги

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