2016-08-14 2 views
1

J'ai un fichier texte nommé "my_text_file.txt". J'ai un autre répertoire nommé "dir". Maintenant, "my_text_file.txt" a plusieurs lignes et il y a un nom de fichier dans chaque ligne. Je veux obtenir seulement les lignes de "my_text_file.txt" qui ont un nom de fichier qui est également présent dans le répertoire "dir".Je dois obtenir seulement ces lignes dans un fichier texte qui contient le nom de fichier des fichiers dans un autre répertoire

J'ai essayé quelque chose comme

ls dir -1 | grep my_text_file.txt 

mais ne semble pas fonctionner. Toute aide est appréciée.

Répondre

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

Vous pouvez utiliser cette boucle while:

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

Ou en utilisant xargs vous pouvez faire:

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

O.O - un peu trop je pense? –

+1

Plutôt que de boucler éventuellement un grand ensemble de tous les fichiers dans le répertoire, il est préférable de faire une boucle sur les fichiers à partir du fichier texte et d'éviter le grep. – anubhava

+1

Fait sens; en supposant que le fichier est plus petit que la liste du répertoire. –

1

Vous devez passer 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

Cela échouera pour les fichiers dont les noms contiennent des espaces et/ou des caractères globaux et/ou des métacaractères regexp et/ou des fichiers dont les noms correspondent partiellement à d'autres fichiers (1.txt correspond à 11.txt), etc. –

1

Vous n'avez pas dit quelle coque vous utilisez. Si vous avez bash ou zsh, vous pouvez utiliser

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

si cela fonctionne avec d'autres shells, je ne sais pas.