J'ai deux répertoires A et B. Chacun contient un Zip.
Comment puis-je écrire le chemin de ces deux fichiers Zip dans un fichier texte?
Exemple pour le système de répertoires:
FILES/ONE/one.Zip
FILES/TWO/two.Zip
Et je veux lancer la commande depuis le répertoire FILES
Vous pouvez utiliser la commande find
, avec sa sortie dirigée vers un fichier, de la manière suivante:
/tmp/FILES$ find . -name "*.Zip" -print > outfile.txt
Recherchez tous les fichiers terminés par Zip
dans le dossier actuel (FILES
) et imprimez-le chemin
La sortie de la commande find
est dirigée vers un fichier texte:
Le contenu du outfile.txt
est:
/tmp/FILES$ cat outfile.txt
./TWO/two.Zip
./ONE/one.Zip
Notez que si vous exécutez la commande
find
dans un dossier situé au-dessus du dossierFILES
, votre sortie inclura également la partieFILES
du dossier.
par exemple. lorsque la sortie est dirigée vers stdout
/tmp$ find FILES -name "*.Zip" -print
FILES/TWO/two.Zip
FILES/ONE/one.Zip
Cela peut arriver grâce à un simple effleurement de shell. Par exemple, étant donné
$ tree .
.
├── ONE
│ └── one.Zip
└── TWO
└── two.Zip
2 directories, 2 files
ensuite
$ printf '%s\n' */*.Zip
ONE/one.Zip
TWO/two.Zip
Redirige la sortie dans un fichier en ajoutant > outfile
à la commande. Si vous souhaitez ajouter ./
au début pour rendre le chemin relatif plus explicite, remplacez %s
par ./%s
$ printf './%s\n' */*.Zip > outfile
$ cat outfile
./ONE/one.Zip
./TWO/two.Zip
Si vous voulez faire ceci récursivement, alors bash
le supporte si vous avez activé l'option globstar
Shell, par exemple.
$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.Zip
FILES/ONE/one.Zip
FILES/TWO/two.Zip
Si vous utilisez cela dans un script, vous devriez probablement également activer l'option nullglob
pour gérer correctement le cas dans lequel aucun fichier correspondant n'existe.
Ou vous pouvez le faire avec regex
find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.Zip" > outfile.txt
La sortie est la même:
./TWO/two.Zip
./ONE/one.Zip
Le problème est que cela correspond à tous les fichiers Zip de tous les sous-dossiers. Si vous pouvez définir des sous-dossiers contenant des fichiers, vous pouvez faire:
find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.Zip" > outfile.txt