2016-08-14 5 views
1

У меня есть текстовый файл с именем «my_text_file.txt». У меня есть другой каталог с именем «dir».Мне нужно получить только те строки в текстовом файле, которые содержат имя файла в другом каталоге

Теперь «my_text_file.txt» имеет несколько строк и в каждой строке есть имя файла. Я хочу получить только те строки «my_text_file.txt», которые имеют имя файла, которое также присутствует в каталоге «dir».

Я пытался что-то вроде

ls dir -1 | grep my_text_file.txt 

, но не похоже на работу. Любая помощь приветствуется.

ответ

1
$ ls -1 tmp 
abc def 
bar 
foo 

$ cat file 
stuff 
abc def 
bar 
nonsense 
foo 

$ xargs -d'\n' -I {} -n 1 < file ls tmp/{} 2>/dev/null 
tmp/abc def 
tmp/bar 
tmp/foo 
2

Вы можете использовать это время цикла:

while IFS= read -r line; do 
    f="dir/$line" 
    [[ -f $f ]] && printf "%s\n" "$f" 
done < my_text_file.txt 

Или с помощью xargs вы можете сделать:

xargs -0 ls -ld 2>/dev/null < <(awk -v ORS='\0' '{print ".foo/"$0}' my_text_file.txt) 
+0

О. О. - слишком много, я думаю? –

+1

Вместо того, чтобы зацикливать, возможно, большой набор всех файлов в каталоге, лучше всего перебирать файлы из текстового файла и избегать grep. – anubhava

+1

Имеет смысл; предполагая, что файл меньше, чем список каталогов. –

1

Вам необходимо пройти oh к Grep:

$ ls 
1.txt 2.txt 3.txt files.txt 

$ cat files.txt 
1.txt 
2.txt 
3.txt 
hello.txt 

$ for n in *; do grep -oh $n files.txt; done 
1.txt 
2.txt 
3.txt 
+0

Это не удастся для файлов, чьи имена содержат пробелы и/или символы подстановки и/или метасимволы регулярных выражений и/или файлы, имена которых частично соответствуют другим файлам (1.txt соответствует 11.txt) и т. Д. –

1

Вы не сказали, какую оболочку вы используете. Если у вас есть bash или zsh, вы можете использовать

comm -12 <(ls dir) <(sort my_text_file.txt) 

ли это работает с другими оболочками я тоже не знаю.