Удалить все дубликаты файлов в подкаталогах основного каталога

По какой-то причине это работает, если вы -printнаправляете вывод наxkbcomp:

setxkbmap \
    -I ~/.config/xkb/ \
    -rules evdev-local \
    -layout "my-us(mdvp)" \
    -print |
    xkbcomp -I ~/.config/xkb/ - "$DISPLAY"

Я не думаю, что у вас что-то не так с макетом. Я попытался установить напрямую с setxkbmap, но даже с опцией -verboseвывод бесполезен:

Warning! Multiple definitions of rules file
         Using command line, ignoring X server
Warning! Multiple definitions of keyboard layout
         Using command line, ignoring X server
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+my-us(mdvp)+inet(evdev)+terminate(ctrl_alt_bksp)
geometry:   pc(pc104)
Error loading new keyboard description

Это уровень детализации по умолчанию. Но даже если я поставлю его на 10, что, по-видимому, является максимальным уровнем, он просто выводит «язык C» где он пытается искать файл правил, в дополнение к вышеперечисленному. Он больше ничего не выводит о том, почему он не загружает клавиатуру. описание.

Одна из причин, по которой я предпочитаю использовать канал xkbcomp, а не просто использование setxkbmapсвязано с тем, что первое, по-видимому, дает лучшую ошибку Сообщения.

0
23.12.2019, 19:16
2 ответа

Итак, позвольте мне сформулировать, как я понимаю задачу.

У нас есть текстовый файл "file.txt", содержащий строки с 3 столбцами:

directory = file

файлы с одинаковыми именами могут находиться в разных каталогах, и мы должны сгенерировать строки, чтобы оставить файл с таким же именем только один раз и удалить остальные. Верно?

Входной файл "file.txt":

dir_new_001 = rdt.txt
dir_new_002 = rdt.txt
dir_new_003 = rdt.txt

dir_new_001 = rdt2.txt
dir_new_002 = rdt2.txt

dir_new_001 = rdt3.txt
dir_new_003 = rdt3.txt

Однострочный код для выполнения (с использованием /bin/sh или /bin/bash):

for i in $(cat file.txt|awk '{print $3}'|sort|uniq); do F=$(grep " = $i$" file.txt|tail -n+2|awk '{print $1"/"$3}'|xargs); [ -n "${F}" ] && echo "rm -f ${F}"; done|sort

Результаты:

rm -f dir_new_002/rdt2.txt
rm -f dir_new_002/rdt.txt dir_new_003/rdt.txt
rm -f dir_new_003/rdt3.txt

Если вы хотите удалить файлы, вы всегда можете выполнить «rm» вместо того, чтобы печатать их с помощью «echo».

0
28.01.2020, 02:59

Если у вас есть доступ к утилите fdupes, введите следующую команду:

$ fdupes -rdN dir/

r - recursive
d - preserver first file, delete other dupes
N - run silently (no prompt)

Дополнительные сведения см. в fdupes — инструмент командной строки для поиска и удаления дубликатов файлов в Linux .

0
28.01.2020, 02:59

Теги

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