Estoy tratando de obtener el contenido de un directorio usando el script de shell.
Mi guión es:
for entry in `ls $search_dir`; do
echo $entry
done
donde $search_dir
es un camino relativo. Sin embargo, $search_dir
contiene muchos archivos con espacios en blanco en sus nombres. En ese caso, este script no se ejecuta como se esperaba.
Sé que podría usar for entry in *
, pero eso solo funcionaría para mi directorio actual.
Sé que puedo cambiar a ese directorio, usar y for entry in *
luego volver a cambiar, pero mi situación particular me impide hacerlo.
Tengo dos rutas relativas $search_dir
y $work_dir
tengo que trabajar en ambas simultáneamente, leyéndolas creando / eliminando archivos, etc.
¿Entonces qué hago ahora?
PD: yo uso bash.
bash
shell
directory-listing
jrharshath
fuente
fuente
for entry in "$search_dir/*"
qué no funciona? ¿Por qué necesitamos colocar/*
fuera de las comillas?find
sería más rápido?for entry in "${search_dir}/*"
Las otras respuestas aquí son geniales y responden a su pregunta, pero este es el principal resultado de Google para "bash get list of files in directory", (que estaba buscando para guardar una lista de archivos), así que pensé en publicar un respuesta a ese problema:
Si solo desea un determinado tipo (por ejemplo, cualquier archivo .txt):
Tenga en cuenta que $ search_path es opcional; ls> filename.txt hará el directorio actual.
fuente
ls
para analizar nombres de archivos? No he oído hablar de esto antes.Esta es una manera de hacerlo donde la sintaxis es más simple para mí entender:
./
es el directorio de trabajo actual pero podría reemplazarse con cualquier ruta que*.txt
devuelva cualquier cosa.txt Puede verificar lo que se mostrará fácilmente escribiendo el
ls
comando directamente en el terminal.Básicamente, crea una variable que
yourfilenames
contiene todo lo que el comando de lista devuelve como un elemento separado, y luego lo recorre. El bucle crea una variable temporaleachfile
que contiene un único elemento de la variable por la que está pasando, en este caso un nombre de archivo. Esto no es necesariamente mejor que las otras respuestas, pero lo encuentro intuitivo porque ya estoy familiarizado con ells
comando y la sintaxis del bucle for.fuente
A
,B
yC
. Cree archivos llamadosB\nC
yD
luego elija eliminarlos. El software que no maneja este derecho podría terminar eliminando los archivos preexistentes B y C, incluso si no tuviera permiso para hacer eso.)fuente
fuente
xargs -0 -i echo "{}"
comando, ¿quieres explicarme un poco? En particular, ¿qué hace la-i echo "{}"
parte? También leí de laman
página que-i
ahora está en desuso y deberíamos usar-I
insted-i
sustituye{}
con el arg.{}
es la cadena que se reemplaza con las coincidencias por elfind
comando.xargs
? de forma predeterminada,find
imprime lo que encuentra ... puede eliminar todo de-print0
.Variaciones
Notas:
.
: carpeta actual-maxdepth 1
para buscar de forma recursiva-type f
: buscar archivos, no directorios (d
)-not -path '*/\.*'
: no volver.hidden_files
sed 's/^\.\///g'
: elimina el antepuesto./
de la lista de resultadosfuente
Aquí hay otra forma de listar archivos dentro de un directorio (usando una herramienta diferente, no tan eficiente como algunas de las otras respuestas).
echo *
Emite todos los archivos del directorio actual. Elfor
bucle itera sobre cada nombre de archivo e imprime en stdout.Además, si busca directorios dentro del directorio, colóquelo dentro del
for
bucle:test -d
comprueba si el archivo es un directorio.fuente
La respuesta aceptada no devolverá el prefijo de archivo con a. Para hacer eso use
fuente
En la versión de Linux con la que trabajo (x86_64 GNU / Linux) funciona a continuación:
fuente
$search_dir
significa que se rompe si hay un espacio en el nombre del directorio. (En este caso, puede salirse con la suya sin citarlo$entry
, pero sería una mejor práctica citarlo).mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. El bucle se ejecuta dos veces, una vez imprimiendox
y la segunda vezy/*
, lo que probablemente no sea el resultado esperado.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Si también hay unx
directorio en el directorio actual, se elimina sumariamente, ¡solo porque no citó su variable!Simplemente ingrese este comando simple:
fuente