В GNU awk(gawk
)использование FPAT
для определения поля как последовательности не-#@
символов:
$ gawk '{$1=$1} 1' FPAT='[^#@]+' OFS='\n' file >> Sequence.txt
$
$ tail Sequence.txt
HelloMyName
IsAdam
NiceToMeetYou
Аналогичный подход, на perl:
perl -lpe '$_ = join "\n", /[^#@]+/g' file >> Sequence.txt
Вы можете использовать какой-нибудь скрипт для фильтрации этих файлов на предмет возможных дубликатов. Вы можете переместить в новый каталог все файлы, совпадающие по крайней мере с другим, без учета регистра, в части до первого тире, подчеркивания или пробела в их именах. cd
в каталог jars, чтобы запустить его.
#!/bin/bash
mkdir -p possible_dups
awk -F'[-_ ]' '
NR==FNR {seen[tolower($1)]++; next}
seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) |\
xargs -r -d'\n' mv -t possible_dups/ --
Примечание:-r
— это расширение GNU, позволяющее избежать однократного запуска mv
без файловых аргументов, когда не найдены возможные дубликаты. Также параметр GNU -d'\n'
разделяет имена файлов символами новой строки, что означает, что в приведенной выше команде обрабатываются пробелы и другие обычные символы, но не символы новой строки.
Вы можете отредактировать назначение разделителя полей, -F'[-_ ]'
чтобы добавить или удалить символы, определяющие конец части, которую мы проверяем на дублирование. Теперь это означает «тире, или убрать подчеркивание, или пробел». Как правило, хорошо выявлять больше, чем реальные случаи дублирования, как я, вероятно, делаю здесь.
Теперь вы можете просмотреть эти файлы. Вы также можете сразу выполнить следующий шаг для всех файлов без фильтрации, если считаете, что их количество не очень велико.
Предлагаю вам использовать для этой задачи визуальную оболочку, например mc
, Midnight Commander . Вы можете легко установить mc
с помощью инструмента управления пакетами вашего дистрибутива Linux.
Вы вызываете mc
каталог, в котором находятся эти файлы, или можете перейти туда. Используя терминал X -, вы также можете получить поддержку мыши, но есть удобные ярлыки для чего угодно.
Например, следуя меню Left -> Sorting... -> untick "case sensitive"
, вы получите желаемый отсортированный вид.
Перемещайтесь по файлам с помощью стрелок, и вы можете выбрать многие из них с помощью Вставить , а затем скопировать(F5 ),переместите(F6)или удалите(F8)выделенные элементы. Вот скриншот того, как это выглядит на ваших тестовых данных, отфильтрованных:
У нас есть решение Я принял ответ, который позволил легко достичь моей цели в программе, управляемой bash, в которой не используется менеджер оболочки, такой как MC или Ranger.
#!/bin/bash
declare -a names
xIFS="${IFS}"
IFS="^M"
while true; do
awk -F'[-_ ]' '
NR==FNR {seen[tolower($1)]++; next}
seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) > tmp.dat
IDX=0
names=()
readarray names < tmp.dat
size=${#names[@]}
clear
printf '\nPossible Dupes\n'
for (( i=0; i<${size}; i++)); do
printf '%s\t%s' ${i} ${names[i]}
done
printf '\nWhich dupe would you like to delete?\nEnter # to delete or q to quit\n'
read n
if [ $n == 'q' ]; then
exit
fi
if [ $n -lt 0 ] || [ $n -gt $size ]; then
read -p "Invalid Option: present [ENTER] to try again" dummyvar
continue
fi
#clean the carriage return \n from the name
IFS='^M'
read -ra TARGET <<< "${names[$n]}"
unset IFS
# now remove the filename sans any carriage returns
# from the filesystem
# 12/18/2020
rm "${TARGET[*]}"
echo "removed ${TARGET[0]}" >> rm.log
done
IFS="${xIFS}"
Это работает хорошо для меня, так как не требует чтения сотен имен файлов в поисках дубликатов и будет повторяться до тех пор, пока я не буду доволен результатом. Он также сохраняет мои действия в файл журнала.
Вообще говоря, дублирования модов, с которыми я сталкиваюсь, немногочисленны и редки, но когда они происходят, это надоедает. Этот сценарий значительно улучшает эту ситуацию для меня.
Если вы можете сделать скрипт более интеллектуальным или удобным для пользователя, сделайте это, я хотел бы увидеть его.
РЕДАКТИРОВАНО :5/11/20
РЕДАКТИРОВАНО :18.12.2020