Busque, seleccione y mueva/copie varios archivos a la vez a través de la Terminal

Busqué extensamente publicaciones relevantes antes de escribir, pero me disculpo si ya se ha preguntado y resuelto.

Necesitaría buscar, seleccionar y mover/copiar algunos archivos de una carpeta a partir de una lista en un archivo de texto (pero también podría pegarlo directamente si fuera necesario).

Encontré algunas publicaciones que podrían haber ayudado y, más precisamente, las del siguiente enlace: https://stackoverflow.com/questions/29311880/finding-files-from-list-and-copying-them-into-new -directorio

Esto parece perfecto, pero tengo un error de permiso ( cp: /found_files: Permission denied) y no pude encontrar una solución alternativa (intenté sudoy muchas otras combinaciones).

Este también parecía estar bien: encuentre varios archivos a la vez a través de Terminal . Funciona muy bien para encontrar los archivos, pero no pude encontrar una manera de seleccionarlos para poder moverlos/copiarlos a un nuevo directorio.

Intenté todo esto en macOS Sierra 10.12.6 sin configuraciones especiales ni cambios en la Terminal.

Es útil si proporciona una lista de muestra y el comando que está utilizando para que podamos solucionar el error.
¿Todos los archivos están en el mismo directorio o algunos están en subdirectorios?
Los archivos están todos en el directorio sam.

Respuestas (1)

Obtiene cp: /found_files: Permission deniedporque el script en la publicación vinculada , en su forma actual, está escrito para copiar los archivos enumerados en el /found_filesdirectorio. El /found_filesdirectorio no existe en su Mac y cpse interpreta found_filescomo un archivo ubicado en /. Como /no se puede escribir, obtiene el error de permiso.

Modifiqué el script para que funcione con otros directorios de destino y lo expandí para admitir la copia y el movimiento de archivos:

  1. Terminal de lanzamiento. Seleccione un directorio donde guarde sus scripts, por ejemplo ~/bin:

    cd ~/bin
    
  2. Cree un archivo llamado cplist.shcon estos contenidos:

    #!/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. Hacer el archivo ejecutable:

    chmod a+x cplist.sh
    
  4. Vincular el archivo a mvlist.sh:

    ln -s cplist.sh mvlist.sh
    
  5. Para copiar un conjunto de archivos, use cplist.shlo siguiente:

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

    donde <file list>es un archivo de texto que contiene nombres de archivo, por ejemplo:

    file 1.pdf
    file 2.pdf
    ...
    

    Para mover un conjunto de archivos, use mvlist.shlo siguiente:

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

Por ejemplo:

 ./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'