2017-09-25 5 views
-1

J'ai plusieurs dossiers avec plusieurs fichiers. J'ai besoin de renommer ces fichiers avec le même nom comme le dossier où le fichier stocké avec le préfixe "_partN".Renommez tous les fichiers dans plusieurs dossiers avec certaines conditions dans le script OS Linux simple commande.

A titre d'exemple,

J'ai un dossier nommé "new_folder_for_upload" qui ont 2 fichiers. Je dois convertir le nom de ces 2 fichiers comme,

new_folder_for_upload_part1 new_folder_for_upload_part2

J'ai tant de dossiers comme ci-dessus qui ont plusieurs fichiers. J'ai besoin de convertir tous les noms de fichiers que je décris ci-dessus.

Quelqu'un peut-il m'aider à trouver une commande ou un script linux unique pour faire ce travail automatiquement?

+0

Quels sont les noms d'origine des fichiers? 'part1' et' part2', par hasard, ou devez-vous les énumérer? – DevSolar

+0

Et avez-vous besoin des fichiers renommés dans les sous-dossiers, ou tous dans le répertoire supérieur? – DevSolar

+0

Exemple de fichiers comme: FineHowardMD_1490040273_tab17.pdf HowardFineMD_1463582881_tab17.pdf Je dois changer le nom du fichier avec le nom du répertoire parent et « _partN » Exemple: new_folder_for_upload_part1.pdf new_folder_for_upload_part2.pdf Enfin après la fin de cette travail, j'ai besoin de stocker tous les fichiers de tous les répertoires dans un répertoire supérieur. –

Répondre

1

En supposant que bash shell, et en supposant que vous voulez la numérotation des fichiers à redémarrer pour chaque sous-répertoire, et faire le déplacement de tous les fichiers vers le répertoire supérieur (laissant des sous-répertoires vides). Formaté en tant que script pour faciliter la lecture:

find . -type f -print0 | while IFS= read -r -d '' file 
do 
    myfile=$(echo $file | sed "[email protected]/@@") 
    mydir=$(dirname "$myfile") 
    if [[ $mydir != $lastdir ]] 
    then 
     NR=1 
    fi 
    lastdir=${mydir} 
    mv "$myfile" "$(dirname "$myfile")_part${NR}" 
    ((NR++)) 
done 

Ou comme une commande en ligne:

find . -type f -print0 | while IFS= read -r -d '' file; do myfile=$(echo $file | sed "[email protected]/@@"); mydir=$(dirname "$myfile"); if [[ $mydir != $lastdir ]]; then NR=1; fi; lastdir=${mydir}; mv "$myfile" "$(dirname "$myfile")_part${NR}"; ((NR++)); done 

méfiez-vous. Ceci est armé, et fera un renommage en masse/déplacement de chaque fichier dans ou en dessous de votre répertoire de travail actuel. À utiliser à vos risques et périls.

Pour supprimer les subdirs vides:

find . -depth -empty -type d -delete 
+0

Merci DevSolar, Votre script fourni a fonctionné pour moi. Nous vous remercions de votre aide. –