Estoy tratando de bucle a través de todos los archivos en un directorio.

Quiero hacer algunas cosas en cada archivo (convertir a xml, no se incluye en el ejemplo), a continuación, escribir el archivo a una nueva estructura de directorios.

for file in `find /home/devel/stuff/static/-iname "*.pdf"`;
do
  echo $file;
  sed -e 's/static/changethis/' $file > newfile +".xml";
  echo $newfile;
done

Quiero que los resultados sean:

$archivo => /home/devel/stuff/static/2002/hello.txt

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

¿Cómo tengo que cambiar mi sed línea?

InformationsquelleAutor Mark | 2011-08-30

6 Comentarios

  1. 5

    Si usted necesita cambiar el nombre de varios archivos, yo sugeriría usar rename comando:

    # remove "-n" after you verify it is what you need
    rename -n 's/hello/hi/g' $(find /home/devel/stuff/static/ -type f)

    o, si usted no tiene rename intente esto:

    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
  2. 3

    Están tratando de cambiar el nombre de archivo? Luego

    for file in /home/devel/stuff/static/*/*.txt
    do
        echo "Moving $file"
        mv "$file" "${file/static/changethis}.xml"
    done

    Por favor, asegúrese de /home/devel/stuff/static/*/*.txt es lo que quieres antes de utilizar la secuencia de comandos.

    • no. Estoy tratando de conseguir el nombre de archivo, anexar «.xml» y lo puso en un diff directorio
    • actualizada la respuesta para usted
    • Qiao: El comodín de expansión se pierda ninguna .archivo txt en el directorio estático. El comando find no.
    • Vu, sí que es cierto. Pero yo en realidad no sé si el op tiene archivos txt en el directorio estático. Eso es en parte por qué lo dejé para confirmar si la ruta es correcta.
  3. 1

    Primer lugar, usted tiene que crear el nombre del archivo nuevo basado en el nombre del archivo inicial. La solución obvia es:

    newfile=${file/static/changethis}.xml

    Segundo que usted tiene que asegurarse de que existe el nuevo directorio o crearlo si no:

    mkdir -p $(dirname $newfile)

    A continuación, se puede hacer algo con el archivo:

    doSomething < $file > $newfile
  4. 1

    Yo no haría el for bucle debido a la posibilidad de sobrecarga de la línea de comandos. Líneas de comandos tienen una duración limitada, y si la sobrecarga es, simplemente voy a caer en el exceso, sin darle ningún tipo de advertencia. Podría funcionar si la encuentra devuelve el 100 archivo. Podría funcionar si se devuelve 1000 archivos, pero puede fallar si la búsqueda devuelve 1000 archivos, y nunca sabrás.

    La mejor manera de manejar esto es para canalizar la encontramos en un tiempo de lectura de la declaración como glenn jackman.

    El comando sed sólo funciona en STDIN y en los archivos, pero no en los nombres de archivo, así que si quieres munge su nombre de archivo, tendrás que hacer algo como esto:

    $newname="$(echo $oldname | sed 's/old/new/')"

    para obtener el nuevo nombre del archivo. El $() construir ejecuta el comando y pone los resultados del comando en STDOUT.

    Así, la secuencia de comandos se verá algo como esto:

    find /home/devel/stuff/static/ -name "*.pdf" | while read $file
    do
        echo $file;
        newfile="$(echo $file | sed -e 's/static/changethis/')"
        newfile="$newfile.xml"
        echo $newfile;
     done

    Ahora, ya que estás cambiar el nombre del archivo de directorio, usted tendrá que asegurarse de que el directorio ya existe antes de hacer su mover o copiar:

    find /home/devel/stuff/static/ -name "*.pdf" | while read $file
    do
        echo $file;
        newfile="$(echo $file | sed -e 's/static/changethis/')"
        newfile="$newfile.xml"
        echo $newfile;
    
        #Check for directory and create it if it doesn't exist
        $dirname=$(dirname "$newfile")
        if [ ! -d "$dirname" ]
        then
            mkdir -p "$dirname"
        fi
    
        #Directory now exists, so you can do the move
        mv "$file" "$newfile"
     done

    Nota las comillas para manejar el caso de que haya un espacio en el nombre de archivo.

    Por el camino, en vez de hacer esto:

    if [ ! -d "$dirname" ]
    then
        mkdir -p "$dirname"
    fi

    Usted puede hacer esto:

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

    La || significa ejecutar el siguiente comando sólo si la prueba no es cierto. Por lo tanto, si [ -d «$dirname» ] es una falsa declaración (el directorio no existe), ejecutar mkdir.

    Es una forma bastante común de acceso directo cuando vea secuencias de comandos de shell.

  5. 0
    find ... | while read file; do
      newfile=$(basename "$file").xml;
      do something to "$file" > "$somedir/$newfile"
    done
  6. 0
    OUTPUT="$(pwd)";
    for file in `find . -iname "*.pdf"`;
    do
      echo $file;
      cp $file $file.xml
      echo "file created in directory = {$OUTPUT}"
    done

    Esto creará un nuevo archivo con el nombre whatyourfilename.xml para hola.pdf el nuevo archivo creado sería hello.pdf.xml, básicamente, se crea un archivo nuevo con el .xml añade al final.

    Recordar la secuencia de comandos anterior encuentra los archivos en el directorio /home/devel/stuff/static/ cuyos nombres de archivo coincide con el comparador de cadena del comando buscar (en este caso *.pdf), y la copia en su directorio actual de trabajo.

    El comando buscar en este script en particular sólo busca archivos con nombres de archivo que termina con .pdf Si desea ejecutar esta secuencia de comandos para archivos con nombres de archivo que termina con .txt, entonces usted necesita para cambiar el comando buscar para este find /home/devel/stuff/static/-iname "*.txt",

Dejar respuesta

Please enter your comment!
Please enter your name here