использование linux cmds для сопоставления имен списков с кучей файлов - PullRequest
1 голос
/ 31 июля 2011

У меня небольшая проблема с сопоставлением имен файлов.

У меня есть один текстовый файл, который содержит около 160 имен.У меня есть папка с 2000+ файлами.и некоторые из них содержат эти 160 имен.Я ищу grep cmd, который может взять каждое имя в текстовом файле и попытаться сопоставить его с содержимым папки.

Я пытаюсь сделать это в perl или просто в прямом linux cmds,но ни один из них не сработал очень хорошо для меня, потому что я не знаком ни с одним из них.

так, например: текстовый файл содержит

abc acc eee fff

и папка будет иметь abcXXX, accXXX, eeeXXX и fffXXX

Мне нужно отсортировать список и найтииз которых пропали без вести.

thx Davy

Ответы [ 3 ]

1 голос
/ 31 июля 2011

При поиске по содержимому файлов:

#!/bin/sh  
for i in `cat files`
do
    grep -R $i folder --color
done

и при поиске по имени файла:

#!/bin/sh 
for i in `cat files`
do
find . -name $i*
done
1 голос
/ 31 июля 2011
for file in $(< list); 
do 
   [ ! -f ${file}xxx ] && echo "x: " ${file}xxx
done

list - это файл, содержащий список имен файлов "abc acc ...".
< - это перенаправление - поэтому мы читаем из файла 'list', так же, как $(cat list).Если файл не называется «список», просто замените имя.
file объявляется в этом операторе и итеративно привязывается ко всем этим записям в «списке».Позже он используется как $ {file}.
[ ! -f ${file}xxx ] - это проверка, существует ли -f (ile), для abc он ищет файл abcxxx.
Но!отменяет поиск, поэтому, если такого файла не существует, вызывается echo ....«x:» - просто реликт отладки.

Мы можем улучшить эту часть:

for file in $(< list); 
do 
   [ -f ${file}xxx ] || echo ${file}xxx
done

вместо 'NOT x AND y' мы можем написать 'x OR y' - значение то же самое, только короче: файл делаетсуществовать или повторить его имя.

||это короткое замыкание ИЛИ.

0 голосов
/ 31 июля 2011

Если вы можете сделать так, чтобы текстовый файл имел каждое имя в отдельной строке, тогда следующая команда сделает то, что вам нужно:

ls myfolder | grep -f mytextfile

Один из способов получить каждое имя в отдельной строке втекстовый файл будет редактировать копию в vi и выдавать команды:

:%s/ /^V^M/g
:wq

(^V^M означает тип «control-v», а затем «control-m»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...