Answers:
有几种方法可以实现此目的。我见过的最简单的方法是使用以下内容。
cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/
该语法使用cp命令,后跟所需文件所在目录的路径,所有要复制的文件都用方括号括起来并用逗号分隔。
请确保注意文件之间没有空格。该命令的最后一部分/home/usr/destination/
是您要将文件复制到的目录。
或者如果所有文件都具有相同的前缀但结尾不同,则可以执行以下操作:
cp /home/usr/dir/file{1..4} ./
其中file1,file2,file3和file4将被复制。
从问题的措辞来看,我相信这是您要查找的内容,但是听起来您可能正在寻找一条命令,以从文件列表中读取文件并将它们全部复制到某个目录中。如果是这种情况,请告诉我,我将编辑答案。
所以我写了一些python脚本,我相信应该可以完成工作。但是,我不确定您是否精通python(如果完全精通),因此我将尽力解释如何使用此脚本,并请根据需要询问尽可能多的问题。
import os,sys,shutil
### copies a list of files from source. handles duplicates.
def rename(file_name, dst, num=1):
#splits file name to add number distinction
(file_prefix, exstension) = os.path.splitext(file_name)
renamed = "%s(%d)%s" % (file_prefix,num,exstension)
#checks if renamed file exists. Renames file if it does exist.
if os.path.exists(dst + renamed):
return rename(file_name, dst, num + 1)
else:
return renamed
def copy_files(src,dst,file_list):
for files in file_list:
src_file_path = src + files
dst_file_path = dst + files
if os.path.exists(dst_file_path):
new_file_name = rename(files, dst)
dst_file_path = dst + new_file_name
print "Copying: " + dst_file_path
try:
shutil.copyfile(src_file_path,dst_file_path)
except IOError:
print src_file_path + " does not exist"
raw_input("Please, press enter to continue.")
def read_file(file_name):
f = open(file_name)
#reads each line of file (f), strips out extra whitespace and
#returns list with each line of the file being an element of the list
content = [x.strip() for x in f.readlines()]
f.close()
return content
src = sys.argv[1]
dst = sys.argv[2]
file_with_list = sys.argv[3]
copy_files(src,dst,read_file(file_with_list))
该脚本应该相对简单易用。首先,将以上代码复制到程序gedit(应在Ubuntu中预安装)或任何其他文本编辑器中。
完成此操作后,将文件另存为您的主目录中的move.py(它可以是任何目录,但为了便于说明,请仅使用主目录),或将文件所在的目录添加到PATH中。然后cd
从终端到您的主目录(或保存了move.py的任何目录),并键入以下命令:
python move.py /path/to/src/ /path/to/dst/ file.txt
这应该将源目录中列出的所有文件复制到目标目录中,并带有格式为pic(1).jpg,pic(2).jpg等的重复项。 file.txt应该是一个文件,其中列出您要复制的所有图片,并且每个条目都在其单独的行上。
此脚本绝不会影响源目录,但是请确保输入正确的源目录和目标目录路径,最糟糕的情况是将文件复制到错误的目录。
/
源cp $(pwd)/{file1,file2} /path/to/dst/
或cp $(pwd)/{file1,file2} $(pwd)/{renamed1,renamed2}
等
也许我缺少您的问题的详细信息,但给出的答案似乎过多。如果要命令行解决方案而不是脚本,为什么不这样做:
cd /path/to/src/
cp -t /path/to/dst/ file1 file2 file3 ...
这样做的好处是您可以使用Tab键完成文件名
brew install coreutils
那么您可以获得带g
前缀的常用gnu内容。这样就可以了gcp -t ....
cp
,尤其是OpenBSD和FreeBSD都没有该选项,因此是的-这是GNU cp
特定的。POSIX标准也未指定。由于这是Ubuntu特定站点,因此可以接受,但是对于在OS之间移植脚本,最好坚持使用POSIX标准
这是一个纯bash解决方案。它将从输入文件中读取文件名(每行一个)并复制每个文件名,重命名重复项。
#!/usr/bin/env bash
## The destination folder where your files will
## be copied to.
dest="bar";
## For each file path in your input file
while read path; do
## $target is the name of the file, removing the path.
## For example, given /foo/bar.txt, the $target will be bar.txt.
target=$(basename "$path");
## Counter for duplicate files
c="";
## Since $c is empty, this will check if the
## file exists in target.
while [[ -e "$dest"/"$target"$c ]]; do
echo "$target exists";
## If the target exists, add 1 to the value of $c
## and check if a file called $target$c (for example, bar.txt1)
## exists. This loop will continue until $c has a value
## such that there is no file called $target$c in the directory.
let c++;
target="$target"$c;
done;
## We now have everything we need, so lets copy.
cp "$path" "$dest"/"$target";
done
将此脚本保存在您的文件夹中,$PATH
并以路径列表作为输入进行调用:
auto_copy.sh < file_paths.txt
您还可以从终端作为命令运行整个程序:
while read path; do
target=$(basename "$path");
c="";
while [[ -e bar/"$target"$c ]]; do
echo "$target exists";
let c++;
target="$target"$c;
done;
cp "$file" bar/"$target";
done < file_names;
根据问题的描述,我的理解是:
input.txt
因此,可以使用以下命令:
xargs -I % --arg-file=input.txt cp /path/to/origin_dir/% /path/to/destination
说明:
-I %
指定要在命令中使用的当前处理文件的符号 --arg-file=input.txt
指定接受参数作为命令 input.txt
cp /path/to/origin_dir/% /path/to/destination/
将执行cp
命令,/path/to/origin_dir/%
并替换为/path/to/origin_dir/
和当前处理的文件名。实际示例:
$ cat input.txt
file2.txt
file1.txt
file3.txt
$ ls ./docs
file1.txt file2.txt file3.txt
$ xargs -I % --arg-file=input.txt cp ./docs/% ./docs_destination/
$ ls ./docs_destination/
file1.txt file2.txt file3.txt
cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folder
,其中p
用于复制文件夹权限。