Установка Locale не является функцией рабочего стола GNOME3. Необходимо установить локаль в Операционной системе. man locale
.
существует много проблем в Вашем сценарии, начиная с:
folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...
это действительно делает cd path-to-folder; ls path-to-folder
; если path-to-folder
является абсолютным (запускающийся с '/' как в Вашем примере), это могло бы работать, но он не будет работать каждый раз, когда Вы используете относительные пути. это не будет также работать если path-to-folder
содержит пробелы, поскольку необходимо использовать кавычки везде, например. cd "$folder1"
затем выполнение a while file=$(ls ...)
сделает бесконечный цикл, как file
будет всегда устанавливаться на что-то (содержание каталога).
правильный синтаксис был бы for file in $(ls ...)
, который прекратит работать, как только у Вас есть имена файлов с пробелами (поскольку цикл будет работать foo
и bar
если Вам назвали файл foo bar
). проверьте, почему Вы никогда не должны анализировать вывод ls. вместо использования ls
Вы могли просто сделать for file in *
.
наконец, у Вас могли быть файлы, которые изменяются, даже если там размер не изменяется еще.
хороший способ выполнить итерации по файлам find
команда; хороший способ проверить, изменилось ли что-то, mtime
из файла.
следующая функция дает Вам значение для последнего изменения (mtime) любого файла в данном каталоге
folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1
таким образом, Ваш сценарий мог быть похожим:
#!/bin/bash
dir="$1"
# check whether $dir exists
test -d "${dir}" || exit 1
last=0
current=1
while [ "$last" != "$current" ]; do
last=$current
current=$(find "${dir}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1)
sleep 10
done
echo "directory is now stable..."
еще лучший подход должен был бы активно уведомить получатель, что данный файл был передан. очень простое решение состояло бы в том, чтобы также скопировать пустой фиктивный файл после того, как полезная нагрузка была передана. например, поскольку файл называют foo.avi
скопируйте другой файл foo.avi.copyfinished
; таким образом, только необходимо проверить на существование foo.avi.copyfinished
видеть это foo.avi
готово.
while true; do
for file_ready in *.copyfinished; do
file=${file_ready%.copyfinished}
if [ -e "${file}.converted" ]; then
echo "skipping already converted file ${file}" 1>&2
else
touch "${file}.converted"
do_convert "${file}"
fi
done
sleep 1
done
это решение, очевидно, требует сотрудничества от передающей стороны.
Легче управлять обработкой на передающей стороне, где процесс знает, завершается ли передача. Таким образом, Вы не возьмете прерванные передачи также.
Отправьте файл во временное имя или каталог. Когда отправление закончено, перемещают файл в корректное местоположение
cp srcvideo.avi /folder1/srcvideo.tmp && mv /folder1/srcvideo.tmp /folder1/srcvideo.avi
Затем Ваш сценарий не должен делать всего тестирования на размерах. Это может просто ожидать корректного файла.
cd /folder1 || exit 1
for file in *.avi; do
echo "$file found"
do_some_processing "$file"
done
Вы могли достигнуть того же при помощи отдельного каталога передачи, не изменяя имена файлов, если Вы желаете.
${filename.done}
то, что Вы опрашиваете относительно.
– Matt
19.09.2013, 11:36
Ожидание файлов, чтобы прекратить расти является ужасным способом обнаружить, закончена ли загрузка. Если паузы загрузки слишком долго из-за сетевого незначительного сбоя, Ваш сценарий разожжет.
Лучший способ сделать что-то после завершения загрузки должно или дать программе загрузки команду запускать Ваш скрипт, когда загрузка завершена и успешна, или ожидать до выходов программы загрузки и затем запускать Ваш скрипт, если загрузка была успешна. Любая достойная программа загрузки позволит по крайней мере одну из этих опций.
Если Вы застреваете с некоторым нижним методом загрузки, используйте средство уведомления для реакции, когда файл закончил загружать, вместо того, чтобы вручную наблюдать файл. На Linux средство уведомления является inotify. В зависимости от того, как работает программа загрузки, любой реагирует на закрытие файла (если программа загрузки непосредственно пишет в заключительный файл), или в переименовывание (если программа загрузки сначала пишет во временный файл, затем переименовывает его в место).
Можно использовать инструмент оболочки inotifywait
реагировать, когда событие файла происходит. Вот пример, который преобразовывает каждый переименованный файл.
cd /path/to/directory
inotifywait -m -e moved_to --format=%f . |
while IFS= read -r filename; do
conversion-program "$filename"
done
Если Вы хотите запустить свой сценарий перед знанием, там ли все файлы, первая вещь состоит в том, чтобы проверить, является ли количество файла постоянным. Вы могли сделать что-то как, с помощью listfile = $(ls "$folder")
[ $( echo $listfile | wc -w) != $(ls "$folder" | wc -w) ]
в некоторое время цикле; пока вещь не равна, Ваш сброс $listfile
кому: $(ls "$folder")
. После того как это сделано, можно просто сделать a do
цикл на $listfile
где Вы делаете точно, что Вы делали на одном файле; после того как это сделано, можно запустить преобразование.
echo
в echo $(ls "$folder") | wc -w
избыточно. ls "$folder" | wc -w
достаточно.
– Thomas Nyman
18.09.2013, 14:21
ls
. Кроме того, Вы сбиваете с толкуfor
иwhile
в середине — идиома для цикличного выполнения по файлам в каталогеfor file in *; do ……
. – Gilles 'SO- stop being evil' 19.09.2013, 02:05ls
доставит неприятности (хотя я не потрудился добавлять ссылку к более полному обсуждению). я зафиксируюwhile/for
– umläute 19.09.2013, 10:43modification time
из всех файлов в каталоге. (существует даже объяснение, почему я считаю сравнение размеров плохой идеей). – umläute 19.09.2013, 10:50stat -t \{\} | cut -d' ' -f13
перестанет работать, если имя файла будет содержать пробелы. Использоватьstat -c "%Y" \{\}
вместо этого (также легче ввести и отладить) – ndemou 13.04.2015, 16:25