我想在linux中复制并粘贴文件,但我想只保留文件名的最后两个增量,例如我的代码生成一个文件列表:
aa001 bb001
aa002 bb002
aa003 bb003
aa004 bb004
所以我想保留最后两个增量(* 003 * 004),并复制到其他目录。
答案 0 :(得分:0)
假设您的文件列表位于文件filelist
cat filelist | tail -n 2 | tr '\r\n' ' ' | xargs -d " " -L1 -I{} cp {} "tdir/"
请注意,如果您的代码生成了一个列表,您可以直接输入,而不是先将其写入filelist
。
Tail只会传递包含您要复制的文件的文件的最后两行。将-n 2
更改为-n 1
或-n 3
会更改将要复制的文件数。
Tr会将任何换行符转换为空格,这样xargs就可以很好地拆分新列表。
Xargs将调用cp,并将每个空格分隔值传送到其中,并将它们放入tdir
您可以将--verbose
开关添加到xargs以查看它对cp进行的调用。
查看tail,tr和xargs的手册页以获取更多详细信息。
答案 1 :(得分:0)
假设您的目标文件夹为b
,您可以像这样使用find
:
find -maxdepth 1 \
-type f \
-exec \
bash -c 'f="$(basename "{}")";cp -v "$f" "b/${f##[a-z]*[a-z]}"'
创建一个单独的shell脚本可能会更好,更具可读性,该脚本执行复制工作并从find
调用它:
copy.sh:
#!/bin/bash
source_file="$1"
source_basename="${source_file##*/}"
dest_folder="$2"
dest_file=${source_basename##[a-z]*[a-z]}
dest_file="$dest_folder/$dest_file"
cp -v "$source_file" "$dest_file"
然后这样称呼:
chmod +x copy.sh
source_path="/path/to/source"
dest_path="/path/to/dest"
find "$source_path" -maxdepth 1 -type f -exec ./copy.sh {} "$dest_folder" \;
答案 2 :(得分:-1)
感谢您的回答,我找到了另一种方式(受到第一个回复的启发),所以我做到了:
ls -1t aa* | head -2 | tr '\r\n' ' ' | xargs -d " " -L1 -I{} cp {} "tdir/"
使用ls -1t aa * |的简单方法头-2,我恢复了最后修改的两个文件并以aa *开头,然后我在tdir目录中复制。