bash script kérdés

Lehet-e valahogy bash scripttel ellenőrizni, hogy egy könyvárban van-e *.txt fájl (a csúnya, "No such file or directory" üzenetet elkerülendő).

Ez működik, de csak konkrét fájlnevekre, viszont esetemben a fájlnév eléggé random lehet és sajnos space-t is tartalmaz:

if [ -f /mnt/valami.txt ];then
....
fi

Ez pedig "[: too many arguments" üzenetet, produkál:

if [ -f /mnt/*.txt ];then
....
fi

Hozzászólások

man bash

Pathname Expansion
After word splitting, unless the -f option has been set, bash scans
each word for the characters *, ?, and [. If one of these characters
appears, then the word is regarded as a pattern, and replaced with an
alphabetically sorted list of file names matching the pattern. If no
matching file names are found, and the shell option nullglob is not
enabled, the word is left unchanged. If the nullglob option is set,
and no matches are found, the word is removed. If the failglob shell
option is set, and no matches are found, an error message is printed
and the command is not executed. If the shell option nocaseglob is
enabled, the match is performed without regard to the case of alpha-
betic characters. When a pattern is used for pathname expansion, the
character ``.'' at the start of a name or immediately following a
slash must be matched explicitly, unless the shell option dotglob is
set. When matching a pathname, the slash character must always be
matched explicitly. In other cases, the ``.'' character is not
treated specially. See the description of shopt below under SHELL
BUILTIN COMMANDS for a description of the nocaseglob, nullglob, fail-
glob, and dotglob shell options.

fisher@ap:/data$ shopt -s nullglob
fisher@ap:/data$ if [ -f *.grt ] ; then echo ok ; else echo nemok ; fi
ok
fisher@ap:/data$ shopt -u nullglob
fisher@ap:/data$ if [ -f *.grt ] ; then echo ok ; else echo nemok ; fi
nemok
fisher@ap:/data$ ls *.grt
ls: *.grt nem érhető el: Nincs ilyen fájl vagy könyvtár

Vagy hogy kéne használni?

~ $ mkdir z1
~ $ cd z1
~/z1 $ touch a.a a.b b.b
~/z1 $ for f in *.a; do echo "$f"; done
a.a
~/z1 $ for f in *.b; do echo "$f"; done
a.b
b.b
~/z1 $ for f in *.c; do echo "$f"; done
*.c
~/z1 $ shopt -s nullglob
~/z1 $ for f in *.a; do echo "$f"; done
a.a
~/z1 $ for f in *.b; do echo "$f"; done
a.b
b.b
~/z1 $ for f in *.c; do echo "$f"; done
~/z1 $

find . -type f -name '*.txt' | while read "$files"; do
if [ -f "$files" ]; then
...
fi
done

Bár már a find is konkrétan csak file-okat fog kilistázni a -type f miatt.
A szóközök miatt pedig tedd "" közé a változót.

kb

# if ls /tmp/*.txt > /dev/null 2>&1; then echo "van"; else echo "nincs"; fi

fapados megoldas:

find /mnt/ -type f -name "*.txt" >/dev/null 2>&1

if [ $? ] ; then
echo "letezik"
else
echo "nem letezik"
fi

?


hron@sunshine ~$ find . -maxdepth 1 -name '*.nincsilyen'
hron@sunshine ~$ echo $?
0

A te kodod helyesen:


x=$(find /mnt -type f -name '*.txt' 2>/dev/null | wc -l)

if [ "${x}" -gt 0 ]; then
   echo "letezik" 
else
   echo "nincs ilyen"
fi

--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Részemről úgy szoktam, hogy:

ls *.txt 2>&1 1>/dev/null && ValamiParancs

txtnum=`find /mnt -name *.txt -type f | wc -l`

if [ "$txtnum" -gt 0 ]; then
..
fi

Konycsepp szokik a szemembe a peldak lattan. Eleg kellemetlen hogy az MS a powershellel meg ebben is elobbre jar.

Van powershell linuxra, csak a fejlesztoje szeretkezik normalis forditasi supportot adni melle. Forditsd windowson, vagy hasznald az oaltala kiadott ki tudja milyen binarist. En azon a ponton fejeztem be ezt a tortenetet.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Én ezt próbálnám:

shopts -s nullglob
x=$(echo *txt)

[ -z "$x" ] && echo nincs