Нужна помощь в создании скрипта для переименования текстовых файлов и перемещения их в каталог

Недавно мне удалось убедить маму разрешить мне переключить ее компьютер на 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

К сожалению, я не знаю, как перевести это в форму сценария, поэтому я прошу помощи.

2
задан 29 February 2012 в 21:00

5 ответов

Откройте терминал и откройте текстовый редактор с помощью этой команды (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

2
ответ дан 29 February 2012 в 21:00

Это будет обрабатывать имена файлов безопасно.

#!/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
0
ответ дан 29 February 2012 в 21:00

Это может помочь вам начать:

#!/bin/bash

find . -name 'note*' -not -name '*txt' -exec mv -bf '{}' '{}'.txt \;
find . -name 'note*.txt' -exec mv -bf '{}' /home/username/notes/ \;

-bf заставляет mv не задавать вопросы и резервировать при перезаписи.

0
ответ дан 29 February 2012 в 21:00

Обновленная версия: согласно полезным предложениям 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.
2
ответ дан 29 February 2012 в 21:00

for noteFile in note*[^.txt]; do mv $noteFile /home/username/notes/$noteFile.txt; done

Мне нравится этот ответ лучше :) Единственным недостатком является то, что он перемещает только файлы, которые он переименовал

0
ответ дан 29 February 2012 в 21:00

Другие вопросы по тегам:

Похожие вопросы: