Как получить имена файлов, которые содержат только указанный текст

Сейчас я использую Debian 10 (XFCE ). Я нахожу XFCE очень надежным, и я могу без проблем использовать мусорную корзину и съемные носители, поэтому я не беспокоюсь об этом «предупреждающем» сообщении.

Я делюсь с вами изображением «предупреждающего» сообщения, но на испанском языке, может быть, это поможет вам, и кто-нибудь может объяснить, почему пользователь root продолжает показывать его.

enter image description here

ПС. Быстрый перевод :«Похоже, что gvfs недоступен, важные функции, включая поддержку корзины, съемных устройств и навигации по местоположению, не будут работать».

5
01.11.2021, 04:42
4 ответа

Вы можете использовать grepдважды :a )для вывода списка всех файлов с cat, затем b )отфильтроватьdog-содержащие файлы. Используйте -lи -Lсоответственно, где -lперечисляет имена файлов с совпадениями, а -Lимена файлов без совпадений:

grep -L 'dog' $(grep -l 'cat' <list of files>)

См.man grep:

-L, --files-without-match

Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match.

-l, --files-with-matches

Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match.

6
01.11.2021, 07:12

Это возможное решение, если я правильно понял, что все файлы находятся в одном каталоге и их расширениеtxt:

$ cat a.txt 
cat
dog
$ cat b.txt 
cat
dog
$ cat c.txt 
cat
$ cat d.txt 
dog

Затем команда:

# scan the directory for txt files
$ find /dir -type f -name ".txt" | while IFS= read -r i; do 
    # if it's false that the file does match both 'cat' and 'dog'
    # grep 'cat'
    if ! [[ $(grep -wl 'cat' "$i") && $(grep -wl 'dog' "$i") ]]; then 
      grep -wl 'cat' "$i"
    fi
  done
c.txt

Параметр -lв grepполезен здесь, поскольку он останавливает сканирование после нахождения первого совпадения, поэтому файлы не анализируются полностью.

1
01.11.2021, 06:31
for f in *; do diff -q <(sort -u "$f") <(echo cat) >/dev/null && echo "$f"; done
1
01.11.2021, 14:27

Чтобы найти файлы в каталоге labels/, которые только содержат строку «cats» в одной строке, вы можете сравнить хеш-суммы каждого из этих файлов с «правильной» хэш-суммой:

find labels -type f -exec sh -c 'for arg do [ "$(md5sum < "$arg")" = "54b8617eca0e54c7d3c8e6732c6b687a  -" ] && printf "%s\n" "$arg"; done' findsh {} +

Работа по поиску файлов выполняется с помощью find labels -type f, а фильтрация выполняется внутри части -exec sh -c '...' findsh {} +. Эта внутренняя часть перебирает каждый входящий файл (, переданный ей find, столько, сколько поместится в каждом вызове ), и запрашивает md5sumконтрольную сумму файла. Если контрольная сумма совпадает, то выведите имя файла.

1
01.11.2021, 15:12

Теги

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