1

Я пытаюсь найти все файлы с одинаковым именем файла (исключая расширение файла), которые встречаются 3 раза. Мне также нужен полный путь к файлу.

Что у меня есть сейчас

#get file without extension
alias lse="ls -1R | sed -e 's/\.[a-zA-Z]*$//'"
#print out the current dir and get files occuring 3 times
lse | sed "s;^;`pwd`/;"  | sort | uniq -c | grep " 3 "

Это запускается, как только pwd печатает папку, в которой я запускал команду, а не путь к файлу.

Поэтому я попытался find

find . -type f | sed "s#^.#$(pwd)#" | sort | uniq -c

Это работает, но включает в себя расширение файла. Когда я пытаюсь добавить sed -e 's/\.[a-zA-Z]*$//'" я получаю ошибки, потому что я не уверен, как объединить две команды sed, и я не могу, кажется, передать во второй раз седить?

так что я пытаюсь сделать, это

find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'"| sort | uniq -c | grep " 3 "

но это не работает.

2 ответа2

2

что там "лишнего" во второй команде sed?

 /tmp/test $ touch foo.bar foo.baz foo.foo
 /tmp/test $ find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'| sort | uniq -c | grep " 3 "
 3 /tmp/test/foo
1

Альтернативный, но похожий способ, используя некоторые другие понятия:

find . -type f -printf '%f\n' | sed 's/\.[[:alpha:]]*$//' |\
sort | uniq -c | awk '$1==3'

Область применения:

  • find ' -printf ', чтобы напрямую удалить ведущие каталоги.
  • класс символов [:alpha:] для определения букв. Это эмулирует ваш пример, но не учитывает окончания файлов с номерами (например, .mp3). Измените на [:alnum:] чтобы сопоставить буквы и цифры. Ищите дополнительную информацию о классах персонажей, чтобы увидеть другие возможности.
  • awk чтобы печатать только строки со счетом 3 (легко изменить на count>=3 что кажется более логичным). Поскольку print является действием по умолчанию, это может быть выполнено с использованием только awk '$1==3' .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .