Cómo ejecutar el comando "mv" con condiciones: mover archivos con cierta terminación a otra carpeta

Cómo ejecutar el comando "mv" con condiciones: mover archivos con cierta terminación a otra carpeta

Soy estudiante de informática. Segundo año de escuela y estoy aprendiendo sobre Linux. Debido al virus Corona, estudio de forma independiente. Durante mis estudios me encontré con una pregunta con varias secciones; no puedo resolverla.

La pregunta quiere que ejecute el mvcomando: que transfiera algunos archivos a la carpeta. Intenté ejecutar el mvcomando e intenté integrar "pipe" u otros comandos como find.

En mi opinión, este no es un comando normal mv, es necesario integrar más cosas, cómo no puedo descifrarlo. Intenté resolver la pregunta durante unos días. También intenté encontrar preguntas similares en el foro, pero no pude encontrarlas.

La pregunta:

  1. Escriba un comando que copie todos los archivos que terminen en .co .hdentro de la Programscarpeta.

Mi intento fue tal vez hacer eso:

find "*.c" -o "*.h" | mv Programs

Respuesta1

La tarea se puede interpretar de tres maneras:

  1. Copiar todos .clos .harchivosdesde el directorio actualal directorio Programs, o
  2. Copiar todos .clos .harchivosdesde el directorio actual o en cualquier lugar debajo de élal directorio Programs.
  3. Copie todo lo accesible .cy.h desde cualquier lugar del sistemaal directorio Programs.

Tenga en cuenta que la tarea dice "copiar", no "mover". Esto significa que deberías utilizar el cpcomando, no mv.

La primera interpretación de la tarea se resuelve mediante

cp *.[ch] Programs

(suponiendo que *.[ch]coincida con todos los archivos que nos interesan y que no haya muchos miles de ellos en el directorio actual).

La segunda interpretación de la tarea se resuelve mediante

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

Esto busca todos los archivos normales con un sufijo de nombre de archivo .co .hen el directorio actual o debajo de él, y se ejecuta cppara cada uno de esos archivos. No podemos canalizar cpporque esa utilidad no lee su flujo de entrada estándar.

También nos aseguramos deevitarmirando dentro del Programsdirectorio (se supone que es un subdirectorio en el directorio actual). No hacerlo terminaría copiando archivos Programsdesde Programs. Ver "Explicar las opciones -path y -prun de find" para obtener más información sobre -pathy -prune.

La tercera interpretación es fácil de implementar a partir de la segunda:

find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

... sólo necesitamos findcomenzar en la parte superior del árbol de directorios y especificar que el Programsdirectorio a evitar es el que está en la ruta $PWD/Programs.

Es probable que esto le genere una serie de errores debido a que no tiene acceso a todas partes. Para evitar esto, elimine también los directorios a los que no pueda acceder y copie solo los archivos que pueda leer:

find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
    -type f -name '*.[ch]' -readable -exec cp {} Programs \;

Esto requiere GNU findpara la -executableprueba (se puede buscar un directorio si es ejecutable) y la -readableprueba.

Tenga en cuenta que las findvariaciones aquí restringirán los archivos solo a archivos normales (a través de la -type fprueba), mientras que el cp *.[ch]enfoque copiaría cualquier tipo de elemento que termine en esos dos caracteres. Además, la findsolución copiaría archivos ocultos (archivos con nombres que comienzan con un punto), mientras que la primera solución no coincidiría con esos tipos de nombres de forma predeterminada.

información relacionada