Linux bash中的循环增加计数

Linux bash中的循环增加计数,linux,bash,loops,copy,Linux,Bash,Loops,Copy,事实上,我知道这将是一件非常简单的事情,我会错过最基本的东西,但我无法理解这一点 file=( $(find $DIRECTORY -maxdepth 1 -type f) ) total=$(find $DIRECTORY -type f | wc -l) count=0 while [ "$count" -lt "$total" ] do for f in "$file"; do echo -n "Would you like to copy $file? " read yn case

事实上,我知道这将是一件非常简单的事情,我会错过最基本的东西,但我无法理解这一点

file=( $(find $DIRECTORY -maxdepth 1  -type f) )
total=$(find $DIRECTORY -type f | wc -l)
count=0
while [ "$count" -lt "$total" ] 
do
for f in "$file";
do
echo -n "Would you like to copy $file? "
read yn
case $yn in
Y | y )
 cp $f $TARGET
 chmod =r $TARGET/$(basename $file)
 count=$((count + 1))
  ;;
 N | n )
   echo "skipping"
   count=$((count + 1))
  ;;
* ) echo "Please enter Y or N"
    exit 1
  ;;
esac
done
done
(很抱歉格式化)

基本上它现在正在这样做

输入源文件和目标文件。很好

$ ./script.sh ~/work ~/folder
Created target directory.
Would you like to copy /home/USER/work/cash.sh?
然后键入
y/n

他们中的任何一个只给出相同的回答

$ ./script.sh ~/work ~/folder
target directory exists, starting copy
Would you like to copy /home/USER/work/cash.sh? y
Would you like to copy /home/USER/work/cash.sh? y
基本上,它复制了cash.sh文件,它知道目录中有两个文件,它只是不跳到下一个文件并保持在同一个文件上,我不知道如何修复它

老实说,在过去的几个小时里,我一直盯着这个,它让我发疯,任何东西都会有帮助。提前感谢。

您想更改:

echo -n "Would you like to copy $file? "
致:


首先,不要使用大写字母

第二,引用所有变量,除非你明确知道什么时候不想

您将
find
结果存储在一个数组中,因此无需运行
find
两次:

file=( $(find "$directory" -maxdepth 1  -type f) )
total=${#file[@]}   # number of elements in the array
请注意,任何包含空格的文件名都将拆分为单独的单词。假设您的文件名不包含换行符,您可以这样做

mapfile -t file < <(find "$directory" -maxdepth 1 -type f)
另一种技巧是不假设文件名中的字符:

find "$directory" -maxdepth 1 -type f -print0 | while IFS= read -d '' -r filename; do # ...

如果要复制目录中的所有文件,需要在副本中添加-r标志。r标志代表RecurusiveI需要能够一个接一个地复制它们,并让用户决定是跳过一个文件还是复制它。这仍然适用吗?忘记
查找
。忘了数数吧。绕地球一圈就行了<代码>用于“$DIRECTORY/”*中的f;执行
(假设
$DIRECTORY
是您的源代码)…或“$DIRECTORY”/*
中的f的
,以对异常的目录名具有鲁棒性;这里有很多小陷阱。
$f
$file
在循环中是一样的。
“$file”
周围的引号请注意这一点。此外,这并不是问题的答案。事实上,他想要
读-p“你想复制$f吗?”yn
for f in "${file[@]}"; do 
find "$directory" -maxdepth 1 -type f -print0 | while IFS= read -d '' -r filename; do # ...