Недавно мне удалось убедить маму разрешить мне переключить ее компьютер на Ubuntu, и чтобы облегчить ее переход, я хочу автоматизировать как можно больше задач для нее. Мне удалось сделать немало, но есть сценарий, с которым я бы хотел ее оставить, но, к сожалению, я не разбираюсь в сценариях.
Цель состоит в том, чтобы переименовать все текстовые файлы в папке (в основном на рабочем столе) с именем, например. «note *» (без расширения) как «note.txt» (для обеспечения функциональной совместимости и простой загрузки в документы Google) и переместите их в специально предназначенную папку. Мне понадобятся следующие команды:
- find files in current folder named note* (and not ending in .txt) and rename them as note*.txt
- move files named note*.txt to /home/username/notes
К сожалению, я не знаю, как перевести это в форму сценария, поэтому я прошу помощи.
Откройте терминал и откройте текстовый редактор с помощью этой команды (gedit, или фаворит!)
gedit ~/.gnome2/nautilus-scripts/Notes
Это откроет файл в Наутилусе (файловый браузер) папка Scripts для некоторого волшебства, что Вы будете скоро видеть :D
Теперь скопируйте следующий упрощенный код в gedit и сохраните. (Можно использовать Marcelo Morales, если Вы хотите :P)
#!/bin/bash
# Words prefixed with a hash are comments.
# Save directory. Add in your own username and directory here.
movePath=/home/<username>/notes
# Iterate over files in current folder.
for noteFile in **
do
# Check if is a notes file (even if UPPERCASE or lowercase), and not already edited.
if [[ ${noteFile,,} == *"notes"* ]] && [[ ${noteFile,,} != *".txt" ]] && [[ ! -d "$noteFile" ]]
then
# If so, move and rename the file to your save directory.
mv "$noteFile" "$movePath/$noteFile.txt"
fi
done
Дайте исполнимые полномочия сценария.
chmod u+x ~/.gnome2/nautilus-scripts/Notes
Теперь, для наблюдения волшебства Сценариев Наутилуса.
Щелкните правой кнопкой в папке с файлом "примечаний" или два в, перейдите к Сценариям и затем нажмите "Notes", и Вы будете волшебно видеть, что все Ваши файлы "примечаний" обращаются к "notes*.txt"
Сколько еще родительская товарищеская встреча можно добраться?:P
Это будет обрабатывать имена файлов безопасно.
#!/bin/bash
shopt -s extglob # see http://mywiki.wooledge.org/glob
for file in note!(*.txt); do
mv -i "$file" "$HOME/notes/$file.txt"
done
mv -i note*.txt "$HOME/notes/"
Если вы хотите сопоставление без учета регистра, также включите опцию оболочки nocaseglob
.
shopt -s extglob nocaseglob
РЕДАКТИРОВАТЬ: Другой подход
#!/bin/bash
for file in note*; do
# Make sure it's a regular file and not the destination directory
[[ -f $file && ! $file -ef $HOME/notes ]] || continue
mv -i "$file" "$HOME/notes/${file%.[Tt][Xx][Tt]}.txt"
done
Это может помочь вам начать:
#!/bin/bash
find . -name 'note*' -not -name '*txt' -exec mv -bf '{}' '{}'.txt \;
find . -name 'note*.txt' -exec mv -bf '{}' /home/username/notes/ \;
-bf
заставляет mv не задавать вопросы и резервировать при перезаписи.
Обновленная версия: согласно полезным предложениям geirha.
Я избавился от массива, который был довольно ненужным,
и внесенные изменения, к как и какие шарики устанавливаются/сбрасываются.
Исходная версия все еще включена; (для сравнения)
################################################
cd ~/ # create sample files with embedded spaces
touch note\ {1..3}
################################################
#
tdir="$HOME/notes"; # make target dir
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
#
shopt -q nullglob; Xnullglob=$? # state of nullglob
shopt -s nullglob # enable nullglob
shopt -s extglob # enable extglob
#
for f in note!(*.txt) ; do
if [[ -f $f ]] ; then
mv -i "$f" "$tdir/$f.txt"
fi
done
#
((Xnullglob==1)) && shopt -u nullglob # Reset nullglob
#
Исходная версия (с дополнительным хламом):
cd ~/
# create some sample files with embedded spaces
touch note\ {1..3}
#
tdir="$HOME/notes"; # make target dir if not present
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
#
state=($(shopt extglob)) # Save extended globbing state
[[ ${state[1]} == off ]] && shopt -s extglob
#
farray=( note!(*.txt) ) # Build an array of filenames
fcount=${#farray[@]} # Get size of the array
#
for ((findex=0; findex<fcount; findex++));do
if [[ -f "${farray[findex]}" ]] ; then
echo -e $findex "${farray[findex]}"
mv -i "${farray[findex]}" \
"$tdir/${farray[findex]}.txt"
fi
done
#
[[ ${state[1]} == off ]] && shopt -u extglob # Reset extglob
#
# `mv -i` will interactively check with you before overwiting and existing file.
# You can use `mv -bf` to backup an existing file before overwriting it.
for noteFile in note*[^.txt]; do mv $noteFile /home/username/notes/$noteFile.txt; done
Мне нравится этот ответ лучше :) Единственным недостатком является то, что он перемещает только файлы, которые он переименовал