使用 cp/mv 复制/移动多个文件而不使用正则表达式

使用 cp/mv 复制/移动多个文件而不使用正则表达式

假设我有一个文件夹,里面有一些文件和文件夹(文件可以是任何类型)。我想使用mv/cp命令移动/复制其中一些文件和文件夹。有什么方法可以让我随机选择其中一些,就像我们使用 Ctrl 键进行选择,然后使用终端进行移动/复制一样?我不能使用通配符或正则表达式,因为我想选择不同类型的文件,并且它们的名称有少量相似之处。

答案1

如果要将所有文件移动或复制到同一目录,可以使用或-t选项,但这意味着您必须键入/提供每个文件名作为参数。它以以下方式工作,可以使用任意数量的文件作为参数:cpmv

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在图形模式下使用按钮一样选择文件,然后进行复制/移动/删除。

相关内容