Вы должны отделить path
от filename
до того вы применяете mask
. Например, чтобы использовать в сценарии, где каталог передается в качестве аргумента сценария:
path="$1"
## Note: this assumes you are exporting mask earlier. If not, set mask here
for i in "${path}"/*; do
dir="${i%/*}" # path component
ffname="${i##*/}" # filename component
mv "$i" "${dir}/${mask}${ffname}"
done
Это будет применяться mask
ко всем файлам в данном каталоге, независимо от того, где этот каталог.
Пример сценария, который включает в себя это, показан ниже. Вы можете сохранить этот сценарий там, где хотите. Вы можете сделать его исполняемым chmod 0755 scriptname
или позвонить по телефону bash scriptname
. Чтобы использовать сценарий, добавьте путь, по которому вы хотите префикс файлов, в качестве первого аргумента . Например bash scriptname /path/to/files
(или просто scriptname /path/to/files
, если вы сделали это исполняемый файл):
#!/bin/bash
# validate input
[ -n "$1" ] || {
printf "error: insufficient input. Usage: %s /path/to/files\n" "${0//\//}"
exit 1
}
# validate directory
[ -d "$1" ] || {
printf "error: directory not found: '%s'\n" "$1"
exit 1
}
path="$1"
## Note: this assumes you are exporting mask earlier. If not, set mask here
## validate mask set and is 10 chars (added per comment)
[ -n "$mask" -a "${#mask}" -eq 10 ] || {
printf "error: mask '%s' either unset or not 10 characters\n" "$mask"
exit 1
}
# move files
for i in "${path}"/*; do
[ -f "$i" ] || continue # if not file, skip
dir="${i%/*}" # path component
ffname="${i##*/}" # full filename component (with .ext)
mv "$i" "${dir}/${mask}${ffname}"
done
Вот пример того, что движется будет происходить со сценарием под названием prefix.sh
при вызове на каталог dat
в текущем рабочем каталоге и при вызове по ~/tmp
за пределами текущего каталога:
выходной (маска = 3960731225):
$ ./prefix.sh dat
dat/f1f2.dat => dat/3960731225f1f2.dat
dat/field.txt => dat/3960731225field.txt
dat/flop.txt => dat/3960731225flop.txt
dat/hh.dat => dat/3960731225hh.dat
dat/hh1.dat => dat/3960731225hh1.dat
dat/hostnm => dat/3960731225hostnm
dat/hosts.dat => dat/3960731225hosts.dat
$ ./prefix.sh ~/tmp
/home/david/tmp/tcpd.tar.xz => /home/david/tmp/3960731225tcpd.tar.xz
/home/david/tmp/tcpdump-capt => /home/david/tmp/3960731225tcpdump-capt
/home/david/tmp/tcpdump.new.1000 => /home/david/tmp/3960731225tcpdump.new.1000
/home/david/tmp/test => /home/david/tmp/3960731225test
Почему эта помеченная MySQL ?! – Alnitak
Кроме того, в первой версии ваш '$ i' должен по-прежнему быть абсолютным путем, поэтому нет причин, почему текущая рабочая директория должна иметь значение. Это будет иметь значение только в том случае, если ваша первая версия говорит 'for i in *; ... ' – Alnitak
Тогда почему ошибка msg? – Andy