Mova um grupo de arquivos, solicitando ao usuário a confirmação de cada arquivo


9

Sistema: Ubuntu MATE 18.04.

Eu tenho uma coleção de arquivos (em vários diretórios em uma estrutura de diretórios) e quero mover muitos deles para outro diretório. Posso dizer quais arquivos eu quero mover por seus nomes (são títulos de receita), mas não há outra maneira de distinguir entre arquivos que eu quero mover e arquivos que não quero; Preciso tomar uma decisão para cada arquivo examinando o nome eu mesmo.

Então, estou executando um comando uma vez para cada arquivo que quero mover, como

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Mesmo com a conclusão da guia, é muita digitação. O que eu realmente quero fazer é algo como

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

Para que eu possa pressionar you npara cada arquivo.

Como posso mover um grupo de arquivos e ser solicitado a confirmar cada arquivo?

Respostas:


6

Caminho 1: no navegador de arquivos gráfico, usando uma exibição em árvore

Suponho que seu objetivo real é fazer uma escolha para cada arquivo, e não estritamente falando, ser solicitado . No entanto, se você preferir ser avisado sobre cada arquivo em um terminal, consulte o Caminho 2 abaixo.

A maioria dos navegadores de arquivos gráficos suporta uma visualização em árvore, na qual é possível visualizar vários níveis de uma hierarquia de diretórios juntos. Você pode copiar ou mover arquivos para fora dessa visualização, individualmente ou selecionando-os e operando em toda a seleção. Isso funciona mesmo com arquivos de várias pastas.

Em alguns navegadores de arquivos, é necessário acessar o menu Preferências para ativar a exibição em árvore. No Caja, o navegador de arquivos MATE, ele sempre é ativado na exibição de lista. Clique em Exibir → Lista (ou pressione Ctrl+ 2) para alternar para a exibição em lista. Cada diretório possui um pequeno triângulo voltado para a direita à esquerda, indicando que ele pode ser expandido. Para expandir uma pasta, clique nesse triângulo ou pressione a tecla (seta para a direita) quando a pasta estiver selecionada. Neste exemplo, eu selecionei todos eles um por um e estou arrastando todos de uma vez para o seu destino:

vários arquivos selecionados em uma estrutura em árvore no navegador de arquivos Caja, sendo arrastados para outra pasta, mas ainda não foram movidos

Supondo que a origem e o destino estejam na mesma unidade, arrastar os movimentos por padrão. Se você deseja copiar, mantenha pressionada a Ctrltecla.

a situação após a conclusão da movimentação de arrastar, na qual os arquivos selecionados agora estão todos juntos na pasta de destino, em vez de seus locais originais separados

Em teoria, é fácil corrigir erros ao usar esse método, porque a maioria dos navegadores de arquivos (incluindo Caja) suporta Ctrl+ Zpara desfazer ações recentes, incluindo ações em lote. No entanto, tive sorte com isso. Às vezes, os arquivos voltam para a pasta errada.

A boa notícia é que você parece estar trabalhando principalmente com documentos de texto, que tendem a ser pequenos, para que você possa fazer um backup extra tarprimeiro sem muito aborrecimento. Eu sugiro fazer isso independentemente do método que você usa.

Caminho 2 : O findcomando com a -okação

É de uso comum findencontrar arquivos e passar seus caminhos para um comando externo arbitrário com as ações -exece -execdir. Mas findtambém tem -oke -okdiresse prompt antes de cada vez que eles executam um comando. Se você realmente deseja ser avisado em um terminal sobre cada arquivo, acho que este é o caminho a seguir.

Quando feito para produzir os mesmos efeitos mostrados acima, fica assim:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Substitua Textspelo diretório de origem (que poderia ser apenas .se você quiser cd) e Glorious Destination Folderpelo diretório de destino real.

Isso executa um comando por arquivo; diferente de -exece -execdir, -oke -okdirnão suporta +no lugar de \;passar vários caminhos encontrados na mesma invocação de um comando. Consequentemente, você não precisa usar o -t destformulário de mv. Sugiro fazer isso de qualquer maneira, embora, tanto em geral com finde particularmente nesta situação para que os avisos parecem mais com os comandos que eles estão levando aproximadamente.

Quando esse comando é escrito, se findencontrar um link simbólico que finalmente aponte para um arquivo regular, ele (o link, não o destino) será movido em vez de ignorado. Se você realmente deseja operar apenas um arquivo regular, use em -type fvez de -xtype f.

Você pode fazer isso em uma scriptsessão para descobrir o que aconteceu se cometer um erro. Mas, novamente, não há razão para não ter um backup.

Caminho 3: Gere um manifesto e edite-o

Pelo menos enquanto os arquivos não tiverem novas linhas em seus nomes, você pode começar usando um findcomando simples para gerar um manifesto - um arquivo que lista os nomes dos arquivos nos quais você (neste caso potencialmente) está interessado :

find Texts -xtype f >manifest

Substitua manifestpelo nome que desejar para o arquivo que lista os arquivos em consideração (e ajuste as instruções restantes de acordo).

Como acima, substitua Textspelo seu diretório de origem real, o que poderia ser .se você quiser cd. No entanto, se Textsfor um caminho relativo (incluindo se for .), certifique-se de estar no mesmo local mais tarde, quando você executar os movimentos.

Depois de executar esse findcomando, abra manifestem um editor de texto. Este poderia ser nano, vim, emacs, gedit, pluma, etc. No editor, comentário fora as linhas que nome de arquivos que você não deseja mover, colocando um #no início delas. Alguns editores destacam essas linhas de maneira diferente, mesmo quando ele não reconhece seu arquivo em qualquer formato que ele saiba que possui comentários. A maioria não vai, no entanto, e o verdadeiro motivo que sugiro fazer dessa maneira é que você, como humano, provavelmente terá experiência em comentar linhas de arquivos de configuração (e talvez no código-fonte). Acho que este é mais intuitiva e menos propenso a erros, do que seria para marcar as linhas que você não deseja mover.

Obviamente, você pode excluir as linhas dos arquivos que não deseja mover. A vantagem de comentá-los é que ficará claro mais tarde o que você fez.

No meu exemplo, é assim que o conteúdo do arquivo se parece depois que eu o editei:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

Em seguida, você pode filtrar as linhas comentadas grepe canalizar o resultado xargspara passá-las para mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

Como acima, substitua Glorious Destination Folderpelo nome do destino real. É isso aí; seus arquivos são movidos. É claro que você pode escrever echoantes mvpara ver os comandos que serão executados primeiro, se quiser.

A maneira como esse comando funciona é:

  1. O greplinhas de comando saídas de manifestque não ( -v) start ( ^) com opcional ( *espaços em branco) ( \s) seguido de um literal #personagem. O -Psinalizador seleciona PCRE como o dialeto de expressões regulares (o que permite \sque eu considero mais legível do que o tradicional [[:space:]]).
  2. O xargscomando divide sua entrada (que é a saída de grep) em campos terminados por nova linha ( -d '\n') e cola cada campo (sem a nova linha final) como um argumento separado no final do comando mv -t 'Glorious Destination Folder', que ele executa.

11
-okIMHO a melhor resposta
pim

7

Aqui está um pequeno script ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Uso da amostra:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

não esqueça de tornar o script executável ( chmod +x mv-confirm.sh).

NB

Desde que eu não quero mexer com seus arquivos, eu adicionei echoantes do mv comando real . Sinta-se livre para removê-lo para mover os arquivos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.