Linux sposta i file da una directory specifica verso l'alto e cancella la cartella vuota


0

Ho bisogno di spostare i file da una directory all'interno di una directory all'interno di una directory e rimuovere la cartella da cui li spostamento. Avrei bisogno di una sceneggiatura ricorsiva. La struttura della directory:

/Folder0/Alphabetic_folder/Folder_name/DeleteFolder

/Folder0/A/Folder1/DeleteFolder
/Folder0/B/Folder2/DeleteFolder

DeleteFolder ha sempre lo stesso nome che è info. Avrei bisogno di qualcosa come:

  1. vai nella directory (alfabetico)
  2. per tutte le cartelle ci vanno dentro, se c'è un info cartella mv *.* alla cartella corrente, rimuovere info (sarebbe: mv info/* ./ && rm info )
  3. Se info non c'è la cartella di uscita
  4. passa alla cartella successiva

Sono sicuro che questo è un problema banale con alcune abilità di script, ma la mia abilità di script è bassa in questo problema.

Risposte:


1

UPD. funzionerà meglio :)

find -depth -print0 |  while read -d '' -r dir; do if [[ $dir == *info ]]; then mv "$dir"/* /tmp; rmdir "$dir"; fi; done

vecchia risposta qui:

#!/bin/bash
cd /Folder0
for i in `ls`; do #get list of files and dirs in a folder0
    if [ -d $i ]; then #if list item is a folder
    cd $i   #then go inside (in you ex its folder A)
    for j in `ls`; do #list folders and files
            if [ -d $j ]; then #if item is folder
                    cd $j            #go inside (in your ex - Folder1)
                    mv info/* /any_folder_you_want #it will not move files if there is an error
                    rmdir info/ #it will not remove dir if it is not empty
                    cd .. #(go down)
            fi #(go to the next folder Folder2)
    done;  #end of folder A
    cd ..  #go down 
    fi     #next folder B...
done

Devi cambiare parte con mv e rmdir per testare che stai ottenendo i giusti risultati basta mettere ls lì e commentare le righe con mv e rmdir:

#mv info/* /any_folder_you_want #it will not move files if there is an error
ls
#rmdir info/ #it will not remove dir if it is not empty

devi eseguire questo script all'esterno di Folder1.

domande?


le cartelle all'interno di A, B, C con spazio non sono interessate: Cartella0 / A / A - copia / informazioni
Michal Sapsa

find-depth -print0 | mentre leggi -d '' -r dir; fare se [[$ dir == Informazioni ]]; poi mv "$ dir" / / Tmp; rmdir "$ dir"; fi; fatto
Gena Gordeev

/ tmp dovrebbe essere "$ dir /../" e quindi funzionerà come dovrebbe. Grazie per l'aiuto
Michal Sapsa

1

Supponendo che la ricerca sia per tutte le directory alfa dalla directory di lavoro:

dirs=$(find [a-z][A-Z]* -type d -name info) 
for f in $dirs; do echo "$f/*" done     # first test it works to requirements

for f in $dirs; do mv "$f/*" "$f"/..; rmdir "$f"; done # working version with mv and rmdir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.