Код python ниже проверяет вывод acpi -i. если нет выхода: «Где моя батарея?» печатается, иначе «OK, present». Конечно, вы можете поместить любую команду там, используя либо subprocess.call(), либо subprocess.Popen().
#!/usr/bin/env python
import subprocess
get_batterystatus = subprocess.check_output(['acpi', '-i']).decode('utf-8').strip()
if get_batterystatus == "":
print "Where is my battery?"
else:
print "OK, present"
Вот немного улучшенная версия вашего скрипта - основные отличия:
, используя оболочку glob * вместо $(ls) - см. Bash Pitfall # 1, цитирующую любые расширения переменных (разрешает имена файлов с пробелы или другие забавные символы - см. Bash Pitfall # 2), обозначающие конец опций mv с помощью расширения -- GNU - это позволяет обрабатывать имена файлов, которые начинаются с дефиса такжеИтак
for d in *; do
[[ -d "$d" ]] && cd "$d" || continue
for f in *.mp4; do
echo mv -v -- "${f}" "${d}_${f}"
done
cd -
done
Или, более переносимо, вы можете зацикливаться на ./*.mp4, чтобы защитить от ведущих дефис, - но тогда вы должны отключить его во время mv
for d in *; do
[ -d "$d" ] && cd "$d" || continue
for f in ./*.mp4; do
echo mv -v "${f}" "${d}_${f#./}"
done
cd -
done
In в любом случае удалите echo (и -v, если хотите), как только вы убедитесь, что он работает так, как вы ожидаете.
Вот немного улучшенная версия вашего скрипта - основные отличия:
, используя оболочку glob * вместо $(ls) - см. Bash Pitfall # 1, цитирующую любые расширения переменных (разрешает имена файлов с пробелы или другие забавные символы - см. Bash Pitfall # 2), обозначающие конец опций mv с помощью расширения -- GNU - это позволяет обрабатывать имена файлов, которые начинаются с дефиса такжеИтак
for d in *; do
[[ -d "$d" ]] && cd "$d" || continue
for f in *.mp4; do
echo mv -v -- "${f}" "${d}_${f}"
done
cd -
done
Или, более переносимо, вы можете зацикливаться на ./*.mp4, чтобы защитить от ведущих дефис, - но тогда вы должны отключить его во время mv
for d in *; do
[ -d "$d" ] && cd "$d" || continue
for f in ./*.mp4; do
echo mv -v "${f}" "${d}_${f#./}"
done
cd -
done
In в любом случае удалите echo (и -v, если хотите), как только вы убедитесь, что он работает так, как вы ожидаете.
Вот немного улучшенная версия вашего скрипта - основные отличия:
, используя оболочку glob * вместо $(ls) - см. Bash Pitfall # 1, цитирующую любые расширения переменных (разрешает имена файлов с пробелы или другие забавные символы - см. Bash Pitfall # 2), обозначающие конец опций mv с помощью расширения -- GNU - это позволяет обрабатывать имена файлов, которые начинаются с дефиса такжеИтак
for d in *; do
[[ -d "$d" ]] && cd "$d" || continue
for f in *.mp4; do
echo mv -v -- "${f}" "${d}_${f}"
done
cd -
done
Или, более переносимо, вы можете зацикливаться на ./*.mp4, чтобы защитить от ведущих дефис, - но тогда вы должны отключить его во время mv
for d in *; do
[ -d "$d" ] && cd "$d" || continue
for f in ./*.mp4; do
echo mv -v "${f}" "${d}_${f#./}"
done
cd -
done
In в любом случае удалите echo (и -v, если хотите), как только вы убедитесь, что он работает так, как вы ожидаете.
Проблема решена с использованием следующего скрипта:
for i in $(ls); do
if [ -d $i ]; then
fname=${i##*/}
echo $fname
cd $i
for z in *.mp4; do
echo $z
cp $z ${fname}_${z}
rm $z
done
cd ..
fi
done
Предполагая, что вы находитесь в каталоге, содержащем все эти каталоги dancing, writing и т. д., команда
for folder in $(find -mindepth 1 -type d); do
cd $folder
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
done
выполнит то, что вы хотите. Я тестировал его, и он работал, даже когда имена файлов содержали пробелы или символы новой строки. Он не работал с такими символами в именах папок, хотя, например, walking slowly.
Изменить: предыдущий код не обрабатывает пробелы или символы новой строки в именах папок. Чтобы покрыть это, используйте модифицированный код
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
fi
done
Edit: Если имя файла начинается с - (тире), команда может интерпретировать его как параметр. Чтобы справиться с ведущими тире, вставьте -- между командой mv и ее аргументами. Это говорит о том, что mv останавливает сканирование параметров.
Таким образом, конечный код:
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
for file in *; do
mv -- "$file" "${folder}_$file"
done
cd ..
fi
done
Используйте find и prename:
find DIR... -mindepth 1 -type f | prename -n 's/([^\/]+)\/([^\/]+)$/$1\/$1_$2/'
Удалите параметр -n, чтобы фактически переименовать файлы, а не просто печатать, как файлы будут переименованы.
Используйте find и prename:
find DIR... -mindepth 1 -type f | prename -n 's/([^\/]+)\/([^\/]+)$/$1\/$1_$2/'
Удалите параметр -n, чтобы фактически переименовать файлы, а не просто печатать, как файлы будут переименованы.
Проблема решена с использованием следующего скрипта:
for i in $(ls); do
if [ -d $i ]; then
fname=${i##*/}
echo $fname
cd $i
for z in *.mp4; do
echo $z
cp $z ${fname}_${z}
rm $z
done
cd ..
fi
done
Предполагая, что вы находитесь в каталоге, содержащем все эти каталоги dancing, writing и т. д., команда
for folder in $(find -mindepth 1 -type d); do
cd $folder
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
done
выполнит то, что вы хотите. Я тестировал его, и он работал, даже когда имена файлов содержали пробелы или символы новой строки. Он не работал с такими символами в именах папок, хотя, например, walking slowly.
Изменить: предыдущий код не обрабатывает пробелы или символы новой строки в именах папок. Чтобы покрыть это, используйте модифицированный код
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
fi
done
Edit: Если имя файла начинается с - (тире), команда может интерпретировать его как параметр. Чтобы справиться с ведущими тире, вставьте -- между командой mv и ее аргументами. Это говорит о том, что mv останавливает сканирование параметров.
Таким образом, конечный код:
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
for file in *; do
mv -- "$file" "${folder}_$file"
done
cd ..
fi
done
Используйте find и prename:
find DIR... -mindepth 1 -type f | prename -n 's/([^\/]+)\/([^\/]+)$/$1\/$1_$2/'
Удалите параметр -n, чтобы фактически переименовать файлы, а не просто печатать, как файлы будут переименованы.
Проблема решена с использованием следующего скрипта:
for i in $(ls); do
if [ -d $i ]; then
fname=${i##*/}
echo $fname
cd $i
for z in *.mp4; do
echo $z
cp $z ${fname}_${z}
rm $z
done
cd ..
fi
done
Предполагая, что вы находитесь в каталоге, содержащем все эти каталоги dancing, writing и т. д., команда
for folder in $(find -mindepth 1 -type d); do
cd $folder
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
done
выполнит то, что вы хотите. Я тестировал его, и он работал, даже когда имена файлов содержали пробелы или символы новой строки. Он не работал с такими символами в именах папок, хотя, например, walking slowly.
Изменить: предыдущий код не обрабатывает пробелы или символы новой строки в именах папок. Чтобы покрыть это, используйте модифицированный код
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
PRE=${folder#./}
for file in *; do
mv "$file" "${PRE}_$file"
done
cd ..
fi
done
Edit: Если имя файла начинается с - (тире), команда может интерпретировать его как параметр. Чтобы справиться с ведущими тире, вставьте -- между командой mv и ее аргументами. Это говорит о том, что mv останавливает сканирование параметров.
Таким образом, конечный код:
for folder in *; do
if [ -d "$folder" ]; then
cd "$folder"
for file in *; do
mv -- "$file" "${folder}_$file"
done
cd ..
fi
done