我有一个类似以下玩具示例的目录结构
DirectoryTo
DirectoryFrom
-Dir1
---File1.txt
---File2.txt
---File3.txt
-Dir2
---File4.txt
---File5.txt
---File6.txt
-Dir3
---File1.txt
---File5.txt
---File7.txt
我正在尝试将所有文件从DirectoryFrom复制到DirectoryTo,如果有重复项,请保留较新的文件。
DirectoryTo
-File1.txt
-File2.txt
-File3.txt
-File4.txt
-File5.txt
-File6.txt
-File7.txt
DirectoryFrom
-Dir1
---File1.txt
---File2.txt
---File3.txt
-Dir2
---File4.txt
---File5.txt
---File6.txt
-Dir3
---File1.txt
---File5.txt
---File7.txt
我创建了一个包含所有子目录列表的文本文件。此列表的顺序是首先列出NEWEST文件:
Filelist.txt中
C:/DirectoryFrom/Dir1
C:/DirectoryFrom/Dir2
C:/DirectoryFrom/Dir3
所以我想做的是遍历Filelist.txt中的每个目录,复制文件,如果文件已经存在则不替换。
我想在命令行,shell脚本或Python中执行此操作。我是Python的新手,但对命令行有一点经验。但是,我从来没有做过这么复杂的事情。
实际上,我有大约60个文件夹,每个文件夹中有50-200个文件,让你感受到我有多少文件夹。此外,每个文件大约75MB。
我之前在R中做过类似的事情,但它很慢而且并不是真正意义上的。但这是我为shell脚本尝试过的,编辑适合这个玩具示例:
#!/bin/bash
for line in Filelist.txt
do
cp -n line C:/DirectoryTo/
done
答案 0 :(得分:1)
如果DirectoryFrom
中只有一个目录级别,则可以使用:
cp -n DirectoryFrom/*/* DirectoryTo
说明:将DirectoryFrom子目录中存在的每个文件复制到DirectoryTo(如果不存在)
n标志用于不覆盖文件(如果已存在)。
如果目录存在于DirectoryTo 的子目录中, cp
也将忽略这些目录
答案 1 :(得分:1)
# Create test environnement :
mkdir C:/DirectoryTo
mkdir C:/DirectoryFrom
cd C:/DirectoryFrom
mkdir Dir1 Dir2 Dir3
(
cat << EOF
Dir1/File1.txt
Dir1/File2.txt
Dir1/File3.txt
Dir2/File4.txt
Dir2/File5.txt
Dir2/File6.txt
Dir3/File1.txt
Dir3/File5.txt
Dir3/File7.txt
EOF
)| while read f
do
echo "$f : `date`"
echo "$f : `date`" > $f
sleep 1
done
# create Filelist.txt file :
(
cat << EOF
C:/DirectoryFrom/Dir1
C:/DirectoryFrom/Dir2
C:/DirectoryFrom/Dir3
EOF
) > Filelist.txt
# Generate the liste of all files :
cd C:/DirectoryFrom
cat Filelist.txt | while read f; do ls -1 $f; done | sort -u > filenames.txt
cat filenames.txt
# liste of all files path, sorted by time order :
cd C:/DirectoryFrom
ls -1tr */* > all_filespath_sorted.txt
cat all_filespath_sorted.txt
# selected files to be copied :
cat filenames.txt | while read f; do cat all_filespath_sorted.txt | grep $f | tail -1 ; done
# copy of selected files:
cat filenames.txt | while read f; do cat all_filespath_sorted.txt | grep $f | tail -1 ; done | while read c
do
echo $c
cp -p $c C:/DirectoryTo
done
# verifying :
cd C:/DirectoryTo
ls -ltr
# or
ls -1 | while read f; do echo -e "\n$f\n-------"; cat $f; done
#------------------------------------------------
# Other solution for a limited number of files :
#------------------------------------------------
# To list files by order :
find `cat Filelist.txt | xargs` -type f | xargs ls -1tr
# To copy files, the newer will replace the older :
find `cat Filelist.txt | xargs` -type f | xargs ls -1tr | while read c
do
echo $c
cp -p $c C:/DirectoryTo
done