9
votes

Comment puis-je manipuler les noms de fichiers à l'aide de bash et sed?

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. xxx

Je veux que les résultats soient:

dollar => /home/devel/stuff/static/2002/hello.txt

NEWFILE => /home/devel/stuff/changethis/2002/hello.txt.xml

Comment dois-je avoir à Changer mon sed ligne?


0 commentaires

7 Réponses :


4
votes

essayez-vous de changer le nom de fichier? Ensuite, xxx

veuillez vous assurer que / home / devel / trus / statique / * / *. TXT est ce que vous voulez avant d'utiliser le script. < / p>


3 commentaires

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.



9
votes

Si vous devez renommer plusieurs fichiers, je suggère d'utiliser renommer code> Commande: xxx pré>

ou, si vous n'avez pas 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


0 commentaires

0
votes
find ... | while read file; do
  newfile=$(basename "$file").xml;
  do something to "$file" > "$somedir/$newfile"
done

0 commentaires

1
votes

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


0 commentaires

1
votes

Je ne ferais pas la boucle 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.

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> xxx pré>

pour obtenir le nouveau nom du fichier. La construction $ () code> exécute la commande et met les résultats de la commande sur stdout. p>

Donc, votre script ressemblera à ceci comme suit: p> xxx pré>

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>

[ -d "$dirname"] || mkdir -p "$dirname"


0 commentaires

0
votes
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", 

0 commentaires

0
votes

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;


0 commentaires