Katalogi są zmiennymi ustawionymi na pełną ścieżkę
for e in "$DIR_0" "$DIR_1" "$DIR_2"
do
for i in $e/*
do
echo $i
done
Dane wyjściowe dla każdej linii są pełną ścieżką. Chcę tylko nazwę każdego pliku
Odpowiedzi:
2 dla odpowiedzi № 1Szukasz basename
.
2 dla odpowiedzi nr 2
To jest odpowiednik Basha basename
:
echo "${i##*/}"
Usuwa wszystko przed i włącznie z ostatnim ukośnikiem.
0 dla odpowiedzi № 3
Jeśli naprawdę nie chcesz powtarzać, możesz to łatwiej osiągnąć za pomocą polecenia find:
find "$DIR_0" "$DIR_1" "$DIR_2" -type f -maxdepth 1 -exec basename{} ;
Jeśli chcesz recurse over subdirs po prostu pomiń maxdepth:
find "$DIR_0" "$DIR_1" "$DIR_2" -type f -exec basename{} ;
0 dla odpowiedzi nr 4
do przeglądania katalogu rekursywnie z bash
spróbuj tego, możesz go znaleźć tutaj
#! /bin/bash
indent_print()
{
for((i=0; i < $1; i++)); do
echo -ne "t"
done
echo "$2"
}
walk_tree()
{
local oldifs bn lev pr pmat
if [[ $# -lt 3 ]]; then
if [[ $# -lt 2 ]]; then
pmat=".*"
else
pmat="$2"
fi
walk_tree "$1" "$pmat" 0
return
fi
lev=$3
[ -d "$1" ] || return
oldifs=$IFS
IFS=""
for el in $1/ *; do
bn=$(basename "$el")
if [[ -d "$el" ]]; then
indent_print $lev "$bn/"
pr=$( walk_tree "$el" "$2" $(( lev + 1)) )
echo "$pr"
else
if [[ "$bn" =~ $2 ]]; then
indent_print $lev "$bn"
fi
fi
done
IFS=$oldifs
}
walk_tree "$1" ".sh$"
0 dla odpowiedzi № 5
Zobacz także funkcje Basha zgodne z POSIX, aby zastąpić tutaj nazwę i nazwę pakietu:
http://cfaj.freeshell.org/src/scripts/