Ваш скрипт может быть выполнен как команда с одним слоем find, без необходимости синтаксического анализа ls или возиться с глобусами и т. д.
Ваша цель, по мнению читателя, состоит в том, чтобы сделать копии всех файлов в текущем каталоге. Для этого подходящей командой будет:
find . -maxdepth 1 -mindepth 1 -exec cp {} {}".old" \;
Что это значит, что find работает со всеми файлами в каталоге . (текущий) и вызывает cp для каждого файла (следовательно [ f13]). Поскольку find является рекурсивным, мы должны ограничить глубину поиска, поэтому флаг -maxdepth и -mindepth должен избегать перечисления . в качестве одного из результатов поиска.
Пример прогона:
$ 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
$
ПРИМЕЧАНИЕ. cp все равно будет жаловаться на каталоги. Есть несколько способов справиться с этим.
1) вы можете отфильтровать только файлы, если это ваша цель с флагом -type f в find, подобным
find . -mindepth 1 -maxdepth 1 -type f -exec cp {} {}".old" \;
2) Используйте cp -r для создания копий каталогов а также
find . -mindepth 1 -maxdepth 1 -exec cp -r {} {}".old" \;
Это немного длиннее, чем find, но все же выполняет задание и не имеет проблем со специальными именами файлов.
python -c 'import shutil; import os;[shutil.copyfile(f,f + ".old") for f in os.listdir(".") if os.path.isfile("./" + f)]'
Пример прогона:
$ 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
$
Чтобы включить каталоги, используйте 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(".")]'
Обратите внимание, что это не удастся, если вы скажете directory_one.old/ уже существует