J'essaie de boucler à travers tous les fichiers d'un répertoire.
Je veux faire des trucs sur chaque fichier (le convertir en XML, non inclus dans l'exemple), puis écrivez le fichier sur une nouvelle structure de répertoire. p> Je veux que les résultats soient: p> dollar => NEWFILE => Comment dois-je avoir à Changer mon /home/devel/stuff/static/2002/hello.txt code> p>
/home/devel/stuff/changethis/2002/hello.txt.xml code> p>
sed code> ligne? p> p>
7 Réponses :
essayez-vous de changer le nom de fichier? Ensuite, veuillez vous assurer que / home / devel / trus / statique / * / *. TXT code> est ce que vous voulez avant d'utiliser le script. P> < / p>
non. J'essaie d'obtenir le nom de fichier, appendez ".xml" et mettez-le dans un répertoire diff
@MU QIAO: Votre expansion générique manquera tout fichier .txt dans le répertoire statique. La commande de recherche ne sera pas.
@Hai Vu, oui c'est vrai. Mais je ne sais pas réellement si l'op possède des fichiers TXT dans le répertoire statique. C'est en partie pourquoi je l'ai laissé confirmer si le chemin est correct.
Si vous devez renommer plusieurs fichiers, je suggère d'utiliser ou, si vous n'avez pas renommer code> Commande:
renommé Essayez ceci: p>
find /home/devel/stuff/static/ -type f | while read FILE
do
# modify line below to do what you need, then remove leading "echo"
echo mv $FILE $(echo $FILE | sed 's/hello/hi/g')
done
find ... | while read file; do newfile=$(basename "$file").xml; do something to "$file" > "$somedir/$newfile" done
Tout d'abord, vous devez créer le nom du nouveau fichier en fonction du nom du fichier initial. La solution évidente est la suivante:
doSomething < $file > $newfile
Je ne ferais pas la boucle Le meilleur moyen de gérer cela est de tuyer la déclaration de lecture tandis que glenn jackman . p> La commande SED fonctionne uniquement sur STDIN et sur les fichiers, mais pas sur les noms de fichiers, donc Si vous souhaitez connaître votre nom de fichier, vous devrez faire quelque chose comme ceci: p> pour obtenir le nouveau nom du fichier. La construction Donc, votre script ressemblera à ceci comme suit: p> maintenant, puisque vous renonce au répertoire de fichiers, vous devez vous assurer que Le répertoire existe avant de faire votre déménagement ou copier: p> pour code> en raison de la possibilité de surcharger votre ligne de commande. Les lignes de commande ont une longueur limitée et si vous surchargez-la, cela déposera simplement l'excédent sans vous indiquer. Cela pourrait fonctionner si votre recherche renvoie 100 fichier. Cela pourrait fonctionner si elle renvoie 1000 fichiers, mais cela pourrait échouer si votre recherche renvoie 1000 fichiers et vous ne saurez jamais.
$ () code> exécute la commande et met les résultats de la commande sur stdout. p>
[ -d "$dirname"] || mkdir -p "$dirname"
OUTPUT="$(pwd)"; for file in `find . -iname "*.pdf"`; do echo $file; cp $file $file.xml echo "file created in directory = {$OUTPUT}" done This will create a new file with name whatyourfilename.xml, for hello.pdf the new file created would be hello.pdf.xml, basically it creates a new file with .xml appended at the end.Remember the above script finds files in the directory /home/devel/stuff/static/ whose file names match the matcher string of the find command (in this case *.pdf), and copies it to your present working directory.The find command in this particular script only finds files with filenames ending with .pdf If you wanted to run this script for files with file names ending with .txt, then you need to change the find command to this find /home/devel/stuff/static/ -iname "*.txt",
Une fois que je voulais supprimer la trailing -min code> de mes fichiers. I.E. WANTED
ALG-MIN.JPG CODE> Pour se transformer en
ALG.JPG CODE>. Donc, après quelques difficultés, réussi à comprendre quelque chose comme ceci:
for f in *; do echo $f; mv $f $(echo $f | sed 's/-min//g');done;