A vesion do comando 'find'
Seu script pode ser feito como um comando find
de uma linha, sem a necessidade de analisar ls
ou mexer com globs, etc.
Seu objetivo, no que diz respeito à pergunta, é fazer cópias de todos os arquivos no diretório atual. Para isso, o comando apropriado seria:
find . -maxdepth 1 -mindepth 1 -exec cp {} {}".old" \;
O que isto faz é que find
opera em todos os arquivos no diretório .
(atual) e chama cp
por cada arquivo (daí \;
). Como find
é recursivo, precisamos limitar a profundidade da pesquisa, portanto -maxdepth
flag e -mindepth
flag é evitar listar .
como um dos resultados da pesquisa.
Execução da amostra:
$ touch "file one" "file two"
$ find . -maxdepth 1 -mindepth 1 -exec cp {} {}".old" \;
$ ls -1
file one
file one.old
file two
file two.old
$
OBSERVAÇÃO : cp
ainda reclamará dos diretórios. Há algumas maneiras de lidar com isso.
1) você pode filtrar somente arquivos se esse for seu objetivo com -type f
sinalizador em find
like
find . -mindepth 1 -maxdepth 1 -type f -exec cp {} {}".old" \;
2) Use cp -r
para fazer cópias de diretórios também
find . -mindepth 1 -maxdepth 1 -exec cp -r {} {}".old" \;
Python one-liner
Isso é um pouco mais demorado do que find
one, mas ainda faz o trabalho e não tem nenhum problema com nomes de arquivos especiais.
python -c 'import shutil; import os;[shutil.copyfile(f,f + ".old") for f in os.listdir(".") if os.path.isfile("./" + f)]'
Execução da amostra:
$ touch "test file 1" "testfile 2"
$ python -c 'import shutil;import os;[shutil.copyfile(f,f + ".old")
> for f in os.listdir(".")
> if os.path.isfile("./" + f)]'
$ ls -1
test file 1
test file 1.old
testfile 2
testfile 2.old
$
Para incluir diretórios, use shutil.copytree(source,destination)
python -c 'import shutil; import os;[shutil.copyfile(f,f + ".old") if os.path.isfile("./" + f) else shutil.copytree(f,f + ".old") for f in os.listdir(".")]'
Observe que isso falhará se o directory_one.old/
já existir