Precisa de ajuda para criar um script para renomear arquivos de texto e movê-los para um diretório

2

Recentemente, consegui convencer minha mãe a deixar que eu mudasse o PC para o Ubuntu e, para facilitar a transição, quero automatizar o máximo de tarefas possíveis para ela. Eu consegui fazer um pouco, no entanto, há um script que eu gostaria de deixá-la com, mas, infelizmente, eu não tenho conhecimento de scripts.

O objetivo seria renomear todos os arquivos de texto em uma pasta (principalmente Desktop) chamada, "note *" (com extensão w / out) como "note.txt" (para facilitar a interoperabilidade e fazer o upload para o google docs) e movê-los em uma pasta especialmente designada. Os comandos que eu precisaria seriam:

- 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

Infelizmente eu não sei como colocar isso em forma de script, então estou pedindo ajuda.

    
por ygns 31.03.2011 / 14:33

5 respostas

2

Abra um terminal e abra um editor de texto usando este comando (gedit ou seu favorito!)

  

gedit ~ / .gnome2 / nautilus-scripts / Notas

Isso abrirá um arquivo na pasta Scripts do Nautilus (navegador de arquivos) para obter alguma mágica que você verá em breve: D
Agora copie o seguinte código simplificado para gedit e salve. (Você pode usar Marcelo Morales se quiser: 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

Forneça as permissões executáveis do script.

  

chmod u + x ~ / .gnome2 / nautilus-scripts / Notas

Agora, para ver a mágica dos scripts Nautilus.
Clique com o botão direito em uma pasta com um arquivo "anotações" ou duas, vá para Scripts e clique em "Notas" e você verá magicamente todos os seus arquivos "anotados" virarem para "notas * .txt"

Quanto mais mãe amigável você consegue? : P

    
por Alex Stevens 31.03.2011 / 16:34
4

Isso pode ajudar você a começar:

#!/bin/bash

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

O -bf faz com que o mv não faça perguntas e faça backups ao sobrescrever.

    
por H Marcelo Morales 31.03.2011 / 15:54
2

Isso manipulará nomes de arquivos com segurança.

#!/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/"

Se você quiser uma correspondência insensível a maiúsculas e minúsculas, ative também a opção nocaseglob shell.

shopt -s extglob nocaseglob

EDIT: Outra abordagem

#!/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
    
por geirha 02.04.2011 / 00:05
2

Atualizado versão: como por sugestões úteis por geirha .

Eu me livrei do array, que era bastante desnecessário,
e fez alterações em como e quais globs estão definidas / não definidas.
A versão original ainda está incluída; (para comparação)

################################################
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 
#

Versão original (com extra cruft):

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.
    
por Peter.O 02.04.2011 / 18:46
-1

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

Eu gosto dessa resposta melhor :) A única desvantagem é que ela só move arquivos renomeados

    
por user1974 31.03.2011 / 19:20