假设我有一个文件夹,里面有一些文件和文件夹(文件可以是任何类型)。我想使用mv
/cp
命令移动/复制其中一些文件和文件夹。有什么方法可以让我随机选择其中一些,就像我们使用 Ctrl 键进行选择,然后使用终端进行移动/复制一样?我不能使用通配符或正则表达式,因为我想选择不同类型的文件,并且它们的名称有少量相似之处。
答案1
如果要将所有文件移动或复制到同一目录,可以使用或-t
选项,但这意味着您必须键入/提供每个文件名作为参数。它以以下方式工作,可以使用任意数量的文件作为参数:cp
mv
cp -t /destination/directory/ file1 file2 file3
或者
mv -t /destination/directory/ file1 file2 file3
这很费力,但输入文件名可以更容易使用Bash 的 Tab 补全。
或者,以下 bash 脚本将找到目录中的所有文件(作为第一个参数),并将选定的文件复制到目标目录中(作为第二个参数)。
它会检查每个文件并询问您是否要复制该文件。在文件选择结束时,它会显示所选文件的列表并询问您是否要将它们复制到目标目录:
#!/bin/bash
directory=$1
destination=$2
selected_files=()
for f in ${directory}/*
do
if [[ -f $f ]]
then
while true
do
read -p "Would you like to copy ${f}? y/n: " choice
case $choice in
y|Y) selected_files+=("$f");
break ;;
n|N) echo "${f} will not be copied.";
break ;;
*) echo "Invalid choice, enter y/n: " ;;
esac
done
fi
done
echo "The following files will be copied to ${destination}."
for file in "${selected_files[@]}"
do
echo "$file"
done
while true
do
read -p "Are these the correct files? y/n: " confirm
case $confirm in
y|Y) break ;;
n|N) echo "Exiting filechooser"; exit 1 ;;
*) echo "Invalid choice, enter y/n: " ;;
esac
done
cp -t "$destination" "${selected_files[@]}"
请注意,此脚本中没有错误检查,例如目标目录是否存在,或者您是否输入了正确的参数。
答案2
这是一个选择一组随机文件/目录进行复制的脚本。它可以处理任意文件名,甚至包含换行符和空格的文件名。将脚本另存为~/bin/randomCopy.sh
,使其可执行(chmod a+x ~/bin/randomCopy.sh
),然后运行它,将源目录作为第一个参数,将目标目录作为第二个参数,并指定要复制的文件/目录的数量(脚本不会区分文件和目录,正如您所要求的那样)。例如,要将 5 个随机文件或目录从复制/foo
到/bar
:
randomCopy.sh /foo /bar 5
剧本:
#!/bin/bash
if [ $# -lt 3 ]; then
cat<<EOF
This script needs at least 3 arguments: the source directory, the
target directory and the number of files/dirs to be copied. For example:
$0 /from /to 5
EOF
exit
fi
sourceDir="$1"
targetDir="$2"
number="$3"
## Collect all file and directory names. The globstar
## bash option lets ** match all files and directories
## recursively
shopt -s globstar
dirsAndFiles=( ** )
## Get $num random numbers from 0 until
## the number of files and dirs found. This
## will let us take a random selection.
limit=$((${#dirsAndFiles[@]}-1))
numbers=$(shuf -i 0-"$limit" -n "$number")
for num in $numbers; do
cp -rv "${dirsAndFiles[$num]}" "$targetDir"
done
请注意,如果目标目录中存在具有相同文件名的文件,这将覆盖现有文件。
答案3
也许尝试使用类似午夜指挥官? 它是一个控制台应用程序,提供与图形 Nautilus 文件管理器类似的功能。
答案4
最近我发现了使用 xargs 解决此问题的有效方法。
`xargs cp
file1
file2
.....
.....
<path of the destination folder>`
然后输入Ctrl + C
。这肯定会起作用。我已经测试过了。通过这种方法,我们可以像Ctrl
在图形模式下使用按钮一样选择文件,然后进行复制/移动/删除。