Trova, seleziona e sposta / copia più file contemporaneamente tramite Terminale

1

Ho cercato numerosi post rilevanti prima di scrivere, ma mi scuso se è già stato chiesto e risolto.

Avrei bisogno di trovare, selezionare e spostare / copiare alcuni file da una cartella partendo da un elenco in un file di testo (ma potrei anche incollarlo direttamente se necessario).

Ho trovato alcuni post che potrebbero aver aiutato e più precisamente quelli al seguente link: link

Sembra perfetto ma ho un errore di autorizzazione ( cp: /found_files: Permission denied ) e non sono riuscito a trovare un rimedio (provato sudo e molte altre combinazioni).

Anche questo sembra buono: Trova più file contemporaneamente Terminal. Funziona molto bene per trovare i file ma non ho trovato il modo di selezionarli per poterli spostare / copiare in una nuova directory.

Ho provato tutto questo su macOS Sierra 10.12.6 senza configurazioni speciali o modifiche nel terminale.

    
posta Michael 19.08.2018 - 14:22
fonte

1 risposta

3

Ottieni cp: /found_files: Permission denied perché lo script nel post collegato , nella sua forma attuale, viene scritto per copiare il file elencati nella directory /found_files . La directory /found_files non esiste sul tuo Mac e cp interpreta found_files come un file che si trova in / . Poiché / non è scrivibile, ottieni l'errore di autorizzazione.

Ho modificato lo script in modo che funzioni con altre directory di destinazione e l'ho espanso per supportare la copia e lo spostamento di file:

  1. Avvia terminale. Seleziona una directory in cui salvi gli script, ad esempio ~/bin :

    cd ~/bin
    
  2. Crea un file chiamato cplist.sh con questi contenuti:

    #!/bin/bash
    
    source_dir="$1"
    destination_dir="$2"
    file_list="$3"
    
    # Sanity checks
    if [[ $# -ne 3 ]]; then
        echo "Usage: $0 <source dir> <target dir> <file list>"
        exit 0
    fi
    if [[ ! -d "$source_dir" ]]; then
        echo "$0: '$source_dir' could not be found"
        exit 1
    fi
    if [[ ! -d "$destination_dir" ]]; then
        echo "$0: '$destination_dir' could not be found"
        exit 1
    fi
    if [[ ! -f "$file_list" ]]; then
        echo "$0: '$file_list' could not be found"
        exit 1
    fi
    
    # Copy or move?
    if [[ $(basename $0) == "mvlist.sh" ]]; then
        command="mv"
        action="Moving"
    else
        command="cp -a"
        action="Copying"
    fi
    
    # Copy files    
    while read filename
    do
        echo "$action file '$filename'"
        if [[ -f "$source_dir/$filename" ]]; then
            find "$source_dir" -name "$filename" -exec $command "{}" "$destination_dir" \;
        else
            echo "File '$filename' is listed in '$file_list' but could not be found"
        fi  
    done < "$file_list"
    
  3. Rendi il file eseguibile:

    chmod a+x cplist.sh
    
  4. Collega il file a mvlist.sh :

    ln -s cplist.sh mvlist.sh
    
  5. Per copiare un set di file, usa cplist.sh come segue:

    ./cplist.sh <source dir> <destination dir> <file list>
    

    dove <file list> è un file di testo che contiene nomi di file, ad esempio:

    file 1.pdf
    file 2.pdf
    ...
    

    Per spostare un set di file, usa mvlist.sh come segue:

    ./mvlist.sh <source dir> <destination dir> <file list> 
    

Ad esempio:

 ./mvlist.sh 
 Usage: ./mvlist.sh <source dir> <target dir> <file list>

 ./mvlist.sh /tmp/ /nonexistentfolder filelist.txt
 ./mvlist.sh: '/nonexistentfolder' could not be found

 ./mvlist.sh /tmp/source/ /tmp/destination filelist.txt
 Moving file 'file 1.pdf'
 Moving file 'file 2.pdf'
 Moving file 'file 3.pdf'
 Moving file 'file 4.pdf'
 Moving file 'file 5.pdf'
 Moving file 'file a.pdf'
 File 'file a.pdf' is listed in 'filelist.txt' but could not be found
 Moving file 'file 6.pdf'
 Moving file 'file 7.pdf'
 Moving file 'file 8.pdf'
 Moving file 'file 9.pdf'
    
risposta data 19.08.2018 - 17:51
fonte

Leggi altre domande sui tag