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 mv
comando: que transfiera algunos archivos a la carpeta. Intenté ejecutar el mv
comando 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:
- Escriba un comando que copie todos los archivos que terminen en
.c
o.h
dentro de laPrograms
carpeta.
Mi intento fue tal vez hacer eso:
find "*.c" -o "*.h" | mv Programs
Respuesta1
La tarea se puede interpretar de tres maneras:
- Copiar todos
.c
los.h
archivosdesde el directorio actualal directorioPrograms
, o - Copiar todos
.c
los.h
archivosdesde el directorio actual o en cualquier lugar debajo de élal directorioPrograms
. - Copie todo lo accesible
.c
y.h
desde cualquier lugar del sistemaal directorioPrograms
.
Tenga en cuenta que la tarea dice "copiar", no "mover". Esto significa que deberías utilizar el cp
comando, 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 .c
o .h
en el directorio actual o debajo de él, y se ejecuta cp
para cada uno de esos archivos. No podemos canalizar cp
porque esa utilidad no lee su flujo de entrada estándar.
También nos aseguramos deevitarmirando dentro del Programs
directorio (se supone que es un subdirectorio en el directorio actual). No hacerlo terminaría copiando archivos Programs
desde Programs
. Ver "Explicar las opciones -path y -prun de find" para obtener más información sobre -path
y -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 find
comenzar en la parte superior del árbol de directorios y especificar que el Programs
directorio 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 find
para la -executable
prueba (se puede buscar un directorio si es ejecutable) y la -readable
prueba.
Tenga en cuenta que las find
variaciones aquí restringirán los archivos solo a archivos normales (a través de la -type f
prueba), mientras que el cp *.[ch]
enfoque copiaría cualquier tipo de elemento que termine en esos dos caracteres. Además, la find
solució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.