2017-07-11 55 views
4

我的代码有效,但不是我想要的。基本上,我的代码所做的是通过当前目录查找,搜索文件夹,并在这些文件夹中查看这些文件。如果其中一个文件扩展名是$ Example变量的值,那么它应该删除具有相同起始文件名的所有其他文件,而不考虑扩展名,并将带有$ Example扩展名的扩展名重命名为相同名称,而不使用$示例扩展。下面是代码:保持* nix格式

#!/bin/sh 
set -o errexit 
Example=dummy 
for d in *; do 
    if test "$(ls -A "$d" 2>/dev/null)"; then 
     if [ $(ls -1 ${d}/*.$Example 2>/dev/null | wc -l) -ge 1 ]; then 
      cd $(pwd)/$d; 
      for f in *.$Example; do 
       fileName="${f%.$Example}"; 
       mv "$f" "${f%.$Example}"; 
       #tr "\r" "\n" < "${f%.$Example}" > "${f%.$Example}" 
       listToDelete=$(find -name "$fileName.*"); 
       for g in $listToDelete; do 
        rm $g; 
       done; 
      done; 
      cd ..; 
     fi; 
    fi; 
done 

使用VIM中已创建的文件,所以应该有Linux的格式,而不要使用Windows的格式化。由于某些原因,一旦扩展名已被删除,使用此代码,它将被格式化为\r,并且文件无法运行。我在临时解决方案所在的位置添加了注释,但我想知道是否有某种方法可以改变保留Linux格式的功能,或者可能有另一种方法来实现我想要的功能。由于

+3

'mv'不应该改变文件内容,不管你怎么称呼它。 –

+1

你如何检查该文件是否有'\ r'而不是'\ n'? –

+1

我无法在我的系统上重现此问题,我相信您的问题存在于别处。 –

回答

0

这个答案并没有解决在脚本源代码,一个可能的流浪\r的问题,而是给人做的另一种方式是什么,我相信是用户想要达到什么样的:

#!/bin/bash 

ext='dummy' 
tmpfile=$(mktemp) 

find . -type f -name "*.$ext" \ 
    -execdir bash -x -c \ 
     'cp "$3" "$2" && 
     tee "${3%.$1}"* <"$2" >/dev/null' bash "$ext" "$tmpfile" {} \; 

rm -f "$tmpfile" 

这发现的所有文件与该扩展名并为他们每个人的执行

cp "$3" "$2" && tee "${3%.$1}"* <"$2" >/dev/null 
  • $1将没有点的扩展。
  • $2将是临时文件的名称。
  • $3将被找到的文件。

该命令将第一找到的文件复制到一个临时文件中,然后它会喂该临时文件通过tee这将重复其内容具有相同前缀的所有文件(${3%.$1}将剥离从找到的文件名的扩展名和${3%.$1}*将展开到具有相同前缀的同一目录中的所有文件)。

find的大多数现代实现支持-execdir,它的工作原理与-exec一样,区别在于给定的实用程序将在所找到的名称的目录中执行。另外,{}将是发现事物的无路径基础名称。

鉴于一个目录下面的文件:

$ ls test/ 
f1.bar f1.foo f2.bar f2.foo f3.bar f3.foo 
f1.dummy f1.txt f2.dummy f2.txt f3.dummy f3.txt 

此脚本执行以下操作:

$ bash -x script.sh 
+ ext=dummy 
++ mktemp 
+ tmpfile=/tmp/tmp.9v5JMAcA12 
+ find . -type f -name '*.dummy' -execdir bash -x -c 'cp "$3" "$2" && 
     tee "${3%.$1}"* <"$2" >/dev/null' sh dummy /tmp/tmp.9v5JMAcA12 '{}' ';' 
+ cp f1.dummy /tmp/tmp.9v5JMAcA12 
+ tee f1.bar f1.dummy f1.foo f1.txt 
+ cp f2.dummy /tmp/tmp.9v5JMAcA12 
+ tee f2.bar f2.dummy f2.foo f2.txt 
+ cp f3.dummy /tmp/tmp.9v5JMAcA12 
+ tee f3.bar f3.dummy f3.foo f3.txt 
+ rm -f /tmp/tmp.9v5JMAcA12 

bash(从bash在命令行)调用删除-x禁用跟踪。


我用bash而不是sh因为我sh不能神交${3%.$1}正常。

0

正在使用的文件是在VIM中创建的,所以应该使用Linux格式,而不是Windows格式。

这对正在使用的生产线分离器没有影响。

但我能想到3种不同的可能原因。

VIM取代

\r\n可能已被混淆或Windows线分离器(\r\n)可能已被错误地条纹进行。如果您只是想在某些时候转换Windows行分隔符,请将它们转换为Unix行分隔文件,如果可能的话,将其转换为dos2unix而不是sedvim,然后编辑它们。如果文件使用ViM添加或替换行分隔符,请记住在ViM行分隔符中使用\n进行搜索,并用\r替换,因为ViM只是将文件数据加载到缓冲区中。例如%s/\n/somestring/%s/somestring/\r/g

Cygwin的

如果你使用Cygwin,我敢肯定它默认使用vim Windows行分隔符,但你可以将其更改为Unix行分隔符。不记得如何离开我的头顶。

VIM默认的行分隔符

不知道如何,如果你是一个GNU/Linux系统上这一切都不会发生,但在VIM使用默认的行分隔符可以指定使用的Unix :e ++ff=unix