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:
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.
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 tar
primeiro sem muito aborrecimento. Eu sugiro fazer isso independentemente do método que você usa.
Caminho 2 : O find
comando com a -ok
ação
É de uso comum find
encontrar arquivos e passar seus caminhos para um comando externo arbitrário com as ações -exec
e -execdir
. Mas find
também tem -ok
e -okdir
esse 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 Texts
pelo diretório de origem (que poderia ser apenas .
se você quiser cd
) e Glorious Destination Folder
pelo diretório de destino real.
Isso executa um comando por arquivo; diferente de -exec
e -execdir
, -ok
e -okdir
nã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 dest
formulário de mv
. Sugiro fazer isso de qualquer maneira, embora, tanto em geral com find
e particularmente nesta situação para que os avisos parecem mais com os comandos que eles estão levando aproximadamente.
Quando esse comando é escrito, se find
encontrar 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 f
vez de -xtype f
.
Você pode fazer isso em uma script
sessã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 find
comando 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 manifest
pelo nome que desejar para o arquivo que lista os arquivos em consideração (e ajuste as instruções restantes de acordo).
Como acima, substitua Texts
pelo seu diretório de origem real, o que poderia ser .
se você quiser cd
. No entanto, se Texts
for um caminho relativo (incluindo se for .
), certifique-se de estar no mesmo local mais tarde, quando você executar os movimentos.
Depois de executar esse find
comando, abra manifest
em 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 grep
e canalizar o resultado xargs
para passá-las para mv
:
grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'
Como acima, substitua Glorious Destination Folder
pelo nome do destino real. É isso aí; seus arquivos são movidos. É claro que você pode escrever echo
antes mv
para ver os comandos que serão executados primeiro, se quiser.
A maneira como esse comando funciona é:
- O
grep
linhas de comando saídas de manifest
que não ( -v
) start ( ^
) com opcional ( *
espaços em branco) ( \s
) seguido de um literal #
personagem. O -P
sinalizador seleciona PCRE como o dialeto de expressões regulares (o que permite \s
que eu considero mais legível do que o tradicional [[:space:]]
).
- O
xargs
comando 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.
-ok
IMHO a melhor resposta