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


9

假设我有一个包含一些文件和一些文件夹的文件夹(文件可以是任何类型)。我想使用mv/ cp命令移动/复制其中一些文件和文件夹。有什么方法可以像我使用Ctrl键进行选择以及使用终端进行移动/复制一样来随机选择其中一些吗?我既不能使用通配符,也不能使用正则表达式,因为我想选择不同类型的文件,并且它们的名称具有很少的相似性。


3
您可能需要提供更多信息。有什么样的相似性文件?
Sergiy Kolodyazhnyy

2
即使您不能使用正则表达式或通配符,也可以利用相似性和花括号来扩展参数。无论如何在bash中,如果您具有file1,file2,file3(如以下答案之一),则可以使用cp -t /dest/ file{1,2,3}或用于range cp -t /dest/ file{1..3}。它也适用于非数字参数和组合,例如cp -t /dest/ f{ile,ly}.{csv,txt}executes cp -t /dest/ file.txt file.csv fly.txt fly.csv。如果位置很重要,请谨慎重写,但我发现它们很有用。
neocpp '16

你为什么需要这个?为什么不使用您描述的文件管理器?外壳工具会尽量减少歧义。
Braiam '16

我们都知道,可以使用Ctrl键选择文件夹下的随机文件和文件夹。我只想知道我们是否可以在使用Linux终端时实现类似的技术
MikhilMC '16

Answers:


11

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

cp -t /destination/directory/ file1 file2 file3

要么

mv -t /destination/directory/ file1 file2 file3

这非常费力,但是使用Bash的制表符完成功能可以使键入文件名更加容易。

或者,以下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[@]}"

警告该脚本中没有错误检查目标目录是否存在,或者您输入了正确的参数。


4

这是一个脚本,用于随机选择要复制的文件/目录集。它可以处理任意文件名,甚至包含换行符和空格的文件名。将脚本另存为~/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

请注意,如果目标目录中存在具有相同文件名的文件,这将覆盖现有文件。



0

最近,我发现了使用xargs解决此问题的有效方法。

`xargs cp
 file1
 file2
 .....
 .....
 <path of the destination folder>`

然后输入Ctrl + C。这肯定可以工作。我已经测试过了 通过这种方法,我们可以像Ctrl在图形模式下使用按钮一样选择文件,然后进行复制/移动/删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.