for path in "some" "paths"
do
[ -e "$path" ] || exit 1
done
является более портативным, но означает копировать список путей в цикле и rm
команда. И хранение всех путей в той же строковой переменной означает, что сценарий больше не поддерживает ни одного из IFS
символы в именах файлов.
Своего рода обертка обработала бы этот необычный сценарий. Пример был протестирован как работа, но выбирает минимальные варианты (никакие традиционные/bin/mv опции не могут быть переданы командной строке). Сохраните ниже к сценарию и выполните его (любой с bash script
или chmod +x script
затем выполните его ./script
):
#!/bin/bash
helpusage() {
echo "Usage: $0 targetdir files"
exit
}
getperms() {
/usr/bin/stat --printf="%a" "$1"
}
getowner() {
/usr/bin/stat --printf="%U" "$1"
}
getgroup() {
/usr/bin/stat --printf="%G" "$1"
}
if [[ $# -ge 2 ]]
then
if [[ -d "$1" ]]
then
targetdir=$1
shift
else
helpusage
fi
else
helpusage
fi
td_perms=$(getperms "$targetdir")
td_owner=$(getowner "$targetdir")
td_group=$(getgroup "$targetdir")
/bin/mv --target-directory="$targetdir" "$@" && \
for file in "$@"
do
file="$targetdir/$file"
/bin/chmod "$td_perms" "$file"
/bin/chown "$td_owner":"$td_group" "$file"
done