소스 파일 이름을 바꾸는 프로그램 작성


27

단일 파일에서 입력이 필요없고 출력을 생성하지 않는 프로그램을 작성하십시오. 실행될 때 코드를 변경하거나 다른 부작용을 일으키지 않고 이름에 관계없이 파일에 포함 된 파일의 이름을 바꿔야합니다 .

이것을 달성하는 방법은 좋습니다. 프로그램이 일단 실행되면 파일 이름이 바뀌 었다는 것이 유일한 변경 일뿐입니다. 예를 들어 디렉토리에 새 파일이 없어야합니다.

프로그램을 다시 실행하면 이름이 바뀌어야합니다. 실제로, 프로그램은 임의로 여러 번 실행될 수 있어야합니다.

이 도전의 목적을 위해 :

  • 파일 이름이 항상 1에서 127 자 사이의 소문자 (az) 문자열이라고 가정 할 수 있습니다. (언어에서 파일에 확장자가 있어야하는 경우 확장자 앞에있는 부분을 반전하십시오 (예 : mycode.batedocym.bat))
  • 코드 파일 자체가 디렉토리에 있다고 가정하면 이름 충돌이 발생하지 않습니다 (자체 제외).
  • 파일 이름이 회문이 아니라고 가정 할 수 있습니다 . 회 문인 파일 이름은 그렇지 않은 파일 이름과 마찬가지로 작동해야합니다.
  • 파일 내용이나 메타 데이터를 읽을 수 있습니다. 여기에는 제한 이 없습니다 .
  • 모든 쉘에 동일한 명령 세트가있는 것은 아니기 때문에 프로그램이 최신의 일반적인 일반 운영 체제 (예 : Windows / Linux)에서 실행된다고 가정 할 수 있습니다.

구체적인 예로, mycode자신의 디렉토리 에있는 파일에 Python 프로그램이 있다고 가정하십시오 . 달리는

python mycode

터미널에서 파일 이름이로 바뀌어야합니다 edocym. 이 파일은 edocym해당 디렉토리에 혼자 있어야한다 -라는 이름의 파일이 mycode더 이상 존재하지 않는 것이다. 달리는

python edocym

이름을로 되 돌리면 mycode프로세스가 무한정 반복 될 수 있습니다.

동일한 파이썬 파일의 이름 racecar이 변경되면 (코드를 변경하지 않고)

python racecar

"레이스 카"는 회문이기 때문에 눈에 띄게 변화해서는 안됩니다. 파일 이름이, a또는 경우에도 마찬가지 xx입니다.

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker가 더 높은 투표 응답입니다.


현재 작업 디렉토리가 중요합니까?
브래드 길버트 b2gills

@ BradGilbertb2gills 프로그램이있는 폴더를 다른 곳으로 복사하고 계속 사용할 수 있어야합니다 (권한이 있거나없는 것으로 가정). 쉘의 작업 디렉토리가 파일이있는 폴더라고 가정 할 수 있습니다.
Calvin 's Hobbies

6
컴파일 된 언어를 사용하면 어떻게 되나요? 실행 파일이 규칙에 어떤 영향을 미칩니 까?
EMBLEM

'입력을 허용하지 않고 출력을 생성하지 않음'을 명확히 요청합니다. 기술적으로 파일 이름은 파일 시스템에서 검색해야하는 입력이며 변경된 이름은 파일 시스템으로 보내야합니다. 이들은 입력 및 출력입니다. 다른 출력이 허용 되지 않도록 지정하는 것이 좋습니다 .
atk

또한 하위 프로세스 사용이 입력 / 출력 규칙을 위반한다고 생각하십니까? 즉, 이름 반전과 같이 작업의 일부를 수행하기 위해 별도의 프로세스를 호출하면 다른 프로세스에 이름을 보내고 (코드에서 출력 및 앱으로 입력) 프로세스에서 값을 수신해야합니다 (프로세스 출력) 앱에 입력).
atk

답변:


41

Bash + 공통 리눅스 유틸리티, 13 바이트

내 방법은 @DigitalTrauma와 비슷하지만 파이프로 인해 약간 짧습니다 ls.

mv * `ls|rev`

오 완전 좋다.
디지털 외상

20
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이것은 매우 좋은 첫 번째 대답입니다. :)
Alex A.

1
디렉토리에 다른 파일이없는 경우에만 작동합니다.
WGroleau

1
@WGroleau && terdon : 두 의견 모두 맞지만 질문은 이미 두 가지 가정을 처리합니다.
Julie Pelletier 2016 년

@JuliePelletier 아, 맞아요. 파일 이름은 소문자로만 구성 될 수 있다고 생각했습니다.
terdon

14

C #, 153 바이트

void f(){var x=System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;File.Move(x,new string(x.Reverse().ToArray()).Substring(4)+".exe");}

OO는 멋지고 변수가 정의 될 때까지 모두 다음과 같습니다.

System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name

그건 그냥 의미


12

배쉬 + 일반적인 리눅스 유틸리티, 15

  • @Dennis 덕분에 1 바이트 절약

스크립트가 자체적으로 디렉토리에 있다고 가정합니다.

mv * `rev<<<$0`

6
당신은 코드 파일이 자체 디렉토리에 있다고 가정 할 수있다 , 그래서 $0교체 할 수 있습니다 *.
Dennis

죄송하지만 업데이트에 작은 버그가 있으며 작동하지 않습니다. 가장 간단한 수정 방법은 $0마지막 이 아니라 이전에 사용 했던 것에 더 가까이 돌아가는 것입니다 *.
Julie Pelletier

@JuliePelletier 그것은 시도했을 때 전에 작동하는 것처럼 보였지만, 그렇습니다. * 횡령 확장은 오른쪽에 발생하지 않습니다 <<<.
디지털 외상

7

줄리아, 51 바이트

d,f=splitdir(@__FILE__)
cd(d)do
mv(f,reverse(f))end

이 프로그램은 OS X에서만 테스트되었지만 운영 체제에 구애받지 않아야합니다.

언 골프 드 :

# Get the directory and file name of the current source file
d, f = splitdir(@__FILE__)

# Change the working directory temporarily to d
cd(d) do
    # Overwrite the file with the reverse of its name
    mv(f, reverse(f))
end

8
축하합니다! 20k !!!
Luis Mendo 2016 년

대부분의 답변은 파일이 현재 디렉토리에 있다고 가정하는 것 같으므로 cd. 이 경우 f=readdir()[]훨씬 짧아집니다.
Dennis

6

MATLAB, 50 46 바이트

e='.m';x=mfilename;movefile([x e],[flip(x) e])

4 바이트를 제거하고 테스트 해 주신 @Suever에게 감사드립니다!

Matlab 버전 R2014a와 함께 OS X El Capitan 및 Debian Jessie에서 테스트되었습니다.

Windows 에서 파일이 사용되는 동안 파일 이름을 변경하려면 플래그 'f'( e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f') 가 필요합니다 .

작동 원리

e='.m';                       % Store file extension '.m' in variable `e`
x=mfilename;                  % Get name of file being run, without the extension
movefile([x e],[flip(x) e])   % Move (rename) file. `flip` is used for reversing the
                              % name without extension. [...] is (string) concatenation

어떤 OS 'f'가 필요합니까?
Suever

@Suever Windows. Mac에서는 필요하지 않습니까?
Luis Mendo 2016 년

Linux의 Mac에서는 필요하지 않은 것 같습니다.
Suever

@Suever 감사합니다! 4 bytes off :-)
Luis Mendo 2016 년

@Suever 이것이 작동하는 정확한 OS를 표시 할 수 있습니까?
Luis Mendo 2016 년

4

루비, 24 바이트

File.rename$0,$0.reverse

상당히 자명하다. ( $0실행중인 파일의 이름입니다.)

ruby whatever파일이 포함 된 디렉토리의 작업 디렉토리로 실행하십시오 .


4

배치, 109 바이트

@echo off
set f=%0
set r=
:l
set r=%f:~0,1%%r%
set f=%f:~1%
if not .%f%==. goto l
ren %0.bat %r%.bat

참고 1 : 배치 파일은 .bat;로 끝나야합니다 . 배치 파일은 확장명이없는 이름으로 실행되며이 파일 .bat을 되돌릴 수 없다고 가정합니다. 예를 들어 reverse로 이름 reverse.bat을 바꾸려고 합니다 esrever.bat.
참고 2 : CMD.EXE배치 파일 이름을 바꾼 후 오류가 발생합니다. ( COMMAND.COM처음에는 문자열 조작이 불가능하다는 점을 제외하고는 그렇지 않습니다.)

편집 : 파일 이름이 알파벳임을 보장하여 2 바이트를 절약했습니다 (@ CᴏɴᴏʀO'Bʀɪᴇɴ의 의견에 따라).


3
1. 왜 외치지 않습니까? 2. 나는 당신이 바이트를 절약 할 수 있다고 생각합니다if ]%f% NEQ ] goto l
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ah 예, 파일 이름이 알파벳이므로 실제로 2 바이트를 절약 할 수 있지만 힌트를 주셔서 감사합니다.
Neil


4

C, 102 바이트

main(c,v)char**v;{char*b=strdup(*v),*n=strrchr(*v,47),*t=strchr(b,0);for(;*++n;*--t=*n);rename(*v,b);}

고장:

                            // No #include lines required (for GCC at least)
main(c,v)char**v;{          // K&R style function to save 2 bytes
    char*b=strdup(*v),      // Duplicate args[0] (script path)
        *n=strrchr(*v,47),  // Find last "/" in input
        *t=strchr(b,0);     // Go to end of output string
    for(;*++n;*--t=*n);     // Reverse input into output character-by-character
    rename(*v,b);           // Rename the file
}                           // Implicit return 0

마지막으로 C가 경쟁적이지 않은 도전이 될 것입니다!


우리가 가지고가는 경우에 프로그램이 항상로 호출 될 것을 의미하는 "당신은 파일이있는 폴더가 될 쉘의 작업 디렉토리를 가정 할 수있다" ./myexecutable우리는 단순화 할 수있다, *n=strrchr(*v,47)*n=*v+1(10 개 문자를 저장할 수 있지만, 이것은 완전히 유효하지 않습니다 ././myexecutable예를 들어 로 호출 할 수 있습니다 .


당신이-전술 파일 확장자 (예 : "이 .out")을 유지하려는 경우 또한, 당신은 변경할 수 *t=strchr(b,0)*t=strrchr(b,46)2 바이트를 비용. 그러나 필요하지 않습니다.


니스-나는 renamesrc == dest; 회문 구속 조건을 무료로 만족시키는 것 같습니다.
Toby Speight

여기에는 코드 포인트 47이 구분 기호 인 파일 시스템이 필요합니다. 나는 생각 이 POSIX를 포함 (또는 그 EBCDIC 수 있습니까 /코너의 경우?)
토비 Speight

@TobySpeight 네 , gnu.org/software/libc/manual/html_node/Renaming-Files.html 에서 약간의 설명을 확인 했지만 가장 가까운 것은 "이름 바꾸기의 한 가지 특별한 경우는 oldname과 newname이 동일한 파일의 두 이름 인 경우입니다" 이 경우를 처리하는 일관된 방법은 이전 이름을 삭제하는 것입니다. 그러나이 경우 POSIX에서는 이름 바꾸기를 수행하지 않고 성공을보고해야합니다. 일관성이 없습니다. 운영 체제가 무엇을하는지 알 수 없습니다. " POSIX 호환이 아닌 시스템에서 파일을 삭제하기 만하면됩니다. 예, 실제 코드는 확인해야합니다!
Dave

방금 linux.die.net/man/3/rename 을 확인한 후 Linux에서 POSIX를 호환 적으로 처리하는지 확인합니다. "이전 인수와 새 인수가 동일한 기존 파일로 해석되면 rename ()이 성공적으로 반환되고 다른 작업은 수행되지 않습니다. 동작."
Dave

: 나는 데비안 맨으로 가고 있었다 "만약 oldpathnewpath다음, 같은 파일을 참조 하드 링크를 기존 있습니다 rename()아무것도하지 않으며, 성공 상태를 반환" - 문자열이 동일한 경우, 같은 파일을 참조하십시오.
Toby Speight 2016 년

3

Vitsy + * sh, 15 바이트

iG:`?r.iG' mr',

설명

iG:`?r.iG' mr',
i               Push -1 to the stack. (this assumes that no arguments are passed)
 G              Get the use name of the class specified by the top item of the
                stack. (-1 refers to the origin class, so this class)
  :             Duplicate stack and jump to it.
   `            Read a file with the current stack as its name, replacing the stack
                with the file's contents.
    ?           Shift one stack to the right.
     r          Reverse the current stack.
      .         Write a file with the name specified by the top stack and the
                contents as the second-to-top stack.
       iG       Get the name of the current class again.
         ' mr'  Push 'rm ' to the stack.
              , Execute the current stack as a command.

이 제출물은 안전하지 않은 Vitsy 버전을 사용해야합니다 (온라인으로 온라인에서 할 수 없습니다!).


3

펄 5, 18 바이트

루비와 비슷한 것 (run perl nameofscript) :

rename$0,reverse$0

가능한 경로를 고려하는 것이 더 나쁩니다 (47 바이트)

($a,$b)=$0=~/(.*\/)?(.*)/;rename$0,$a.reverse$b

1
안녕하세요, PPCG에 오신 것을 환영합니다! 첫 번째 게시물!
NoOneIsHere6

2

V , 29 26 바이트

:se ri
izyw:!mv z "
dd

여기에는 인쇄 할 수없는 것이 포함되어 있으므로 다음은 16 진 덤프입니다.

00000000: 3a73 6520 7269 0a69 127a 1b79 773a 216d  :se ri.i.z.yw:!m
00000010: 7620 127a 2012 220a 6464                 v .z .".dd

참고 : TIO는 파일 액세스를 허용하지 않으므로 v.tryitonline.net에서 실행 되지 않습니다.

설명:

:se ri            "Turn on 'reverse mode' (all text is inserted backwards)
i<C-r>z<esc>      "Enter the path to the file in reverse
yw                "Yank a word. This first word is the name we will save the new file as

"Run an "mv" in the terminal with the contents of register 'z' (the path to the file)
"And the contents of register '"' (the word we yanked)
:!mv <C-r>z <C-r>"

dd                "Delete a line so that we don't have any text printed.

2

파이썬 3, 105 바이트

import os;a=__file__.split('\\')[::-1][0].split('.');os.rename('.'.join(a),'.'.join([a[0][::-1],a[1]]))

-Alex.A가 1 바이트를 제거했습니다.

-Digital Trauma는 62 바이트를 빼앗아 간 os.rename ()을 보여주었습니다.

-muddyfish가 7 바이트를 제거했습니다.


난 당신이에 쉼표 후 공간을 제거하여 바이트를 저장할 수 있다고 생각import
알렉스 A.

import os,sys;f=sys.argv[0];os.rename(f,f[::-1])48 바이트에 대한 트릭을해야합니다
Digital Trauma

f [::-1]을 수행하면 파일 이름뿐만 아니라 전체 경로가 반대로 바뀝니다. 그러나 os.rename () 기능을 소개해 주셔서 감사합니다.
마젠타

@Magenta 나를 sys.argv[0]위해 스크립트가 직접 실행될 때 경로없이 파일 이름 만 반환합니다. Helka는 이것이 정상이라고 지적했다
Digital Trauma

@DigitalTrauma 프로그램을 자체적으로 실행했을 때 sys.arg [0]이 전체 경로를 반환했습니다. sys.argv [0]이 파일 이름 인 두 번째 솔루션을 추가하겠습니다.
마젠타

2

PHP, 84, 70, 54 바이트

rename($f=__FILE__,strrev(basename($f,$e='.php')).$e);


편집 :insertusernamehere 주석 덕분에 14 바이트 제거
편집 :Martijn 주석 덕분에 16 바이트 제거


2
당신은 그것을 아래로 얻을 수있는 70 바이트 : rename($f=__FILE__,__DIR__."/".strrev(pathinfo($f)[filename]).".php");.
insertusername 여기

엑셀 런트 !!! 그러나 당신의 코드는 당신이 31 바이트있어 와우, 더 나은
tttony을

상대적으로 만들 수 없습니까? 7 바이트 절약 WOULD :rename($f=__FILE__,"./".strrev(pathinfo($f)[filename]).".php");
Martijn

또는 더 작은 :rename(__FILE__,strrev(basename(__FILE__,'.php')).'.php');
Martijn

시원한! vars 추가하기 이제 54 바이트를 얻었습니다
tttony

2

PowerShell, 39 바이트

mi *(-join((ls).name)[-5..-999]+'.ps1')

안녕하세요, PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

2

파이썬 2 , 41 바이트

import os;s=__file__;os.rename(s,s[::-1])

배쉬 데모.

파이썬은 실제로 파일 확장자를 신경 쓰지 않으므로 전체 파일 이름을 뒤집을 수 있습니다.



1

펄 6 ,  70   27 바이트

다른 작업 디렉토리에서 작업 해야하는 경우 다음과 같은 것이 필요합니다.

$_=$*PROGRAM;.rename: .basename.flip.IO.absolute: .absolute.IO.dirname

작업 디렉토리는 프로그램과 동일한 디렉토리이므로 다음과 같이 단순화 할 수 있습니다.

$_=$*PROGRAM;.rename: .flip

설명:

$_ = $*PROGRAM;  # IO::Path object

$_.rename:
    $_.basename
      .flip      # reverse characters
      .IO        # turn into an IO object (IO::Path)
      .absolute: # turn it into an absolute path Str in the following dir
        $_.absolute.IO.dirname

1

자바 스크립트 (노드), 108 (104) 68 바이트

Downgoat 덕분에 36 바이트가 절약되었습니다!

Windows 버전 :

require("fs").rename(F=__filename,F.split(/.*\\|/).reverse().join``)

다른 버전 :

require("fs").rename(F=__filename,F.split(/.*\/|/).reverse().join``)

@Upgoat 필요가 없습니다. js파일 경로 끝에서 문자가 앞에 일치 합니다. 이것은 항상 .입니다.
Conor O'Brien

1

자바 스크립트 ES6 (Node.js) 70 바이트

아니 정규식 예!

require("fs").rename(a=__filename,[...a].reverse().join``.split`/`[0])

어떤 도움을 주셔서 감사합니다


1

PowerShell v4 +, 68 바이트

$a,$b=($c=(ls).Name)-split'\.';mv $c "$(-join($a[$a.length..0])).$b"

스크립트가 디렉토리 자체에 있어야하기 때문에 작동합니다. ls(별칭)을 수행 하고 결과 객체를 Get-ChildItem가져옵니다 .Name. 우리는에 있음을 저장 $c하고 -split그것을 문자 그대로의 기간에 파일 이름과 확장자를 취득하고, 사람들을 저장 $a하고 $b각각.

다음은 mv(별칭 Move-Item) 명령으로 이동 $c합니다 $a(반전 됨) .$b.

PS C:\Tools\Scripts\golfing\reverse> ls

    Directory: C:\Tools\Scripts\golfing\reverse

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         6/13/2016   7:58 AM         88 reverse.ps1

PS C:\Tools\Scripts\golfing\reverse> .\reverse.ps1

PS C:\Tools\Scripts\golfing\reverse> ls

    Directory: C:\Tools\Scripts\golfing\reverse

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         6/13/2016   7:58 AM         88 esrever.ps1

1

파이썬 (2.7 또는 3.4+), 61 49 바이트

나는 이것이 최적의 파이썬 솔루션에 가깝다고 믿는다.

import os;a=__file__;os.rename(a,a[-4::-1]+".py")

s4b3r6의 답변에서 영감을 얻었 지만 리버스 대신 목록 슬라이싱을 __file__사용하고 두 번 사용할 때 바이트를 절약 하기 위해 변수에 저장합니다.

참고 : 파일 이름이 항상이라고 가정합니다 *.py. 2 문자 파일 확장자를 처리 할 수있는 약간 더 일반적인 솔루션 은 1 바이트의 추가 비용으로 a[-3:]를 대체하는 데 사용 하는 것 ".py"입니다.

업데이트 : 목록 슬라이싱 트릭 a[-4::-1]을 사용 하여 파일 확장자를 제거하고로 바꾸지 않고 12 바이트를 절약 했습니다 a.split(".")[0][::-1].


1

파워 쉘, 112 바이트

나는 유닉스 cmds를 이기지 않을 것이고, 재미를 위해 두 펜스를 추가하는 것입니다 :-)

gci * | % { $n=($_.basename[-1..-(($_.basename).length)] -join “”)+$_.Extension; mv -Path $_.Fullname -Dest $n }

PPCG에 오신 것을 환영합니다! 답변에 점수가 표시되어야하므로 수정했습니다. 또한 코드를 강조 표시하고 대괄호 모양의 버튼을 선택 {}하거나 코드 앞에 4 개의 공백을 추가 하여 코드의 형식을 지정할 수 있습니다 .
FryAmTheEggman

0

PowerShell, 50 바이트

mv *(-join($f=(ls).BaseName)[$f.Length..0]+'.ps1')

파일 mv *이 하나뿐 이므로 쉘 와일드 카드는 하나의 결과 만 갖습니다. 대상 이름은 (ls).basename모든 파일 ( 'dir'의 별칭 ) 을 나열하고 BaseName 속성을 호출합니다. 파일이 하나뿐이므로 PowerShell은 1 개 항목 배열을 문자열로 압축 해제합니다. 해당 파일 이름을에 저장 $f한 다음 카운트 다운 및 -join역순 문자를 사용하여 문자열로 다시 색인 합니다. 필수 .ps1접미사를 추가하십시오 .


0

AutoIt, 45 바이트

$a=@ScriptName
FileMove($a,StringReverse($a))

0

파이썬 2.7, 68 바이트

import os; a = __ file __; os.rename (a, a.split ( "\\") [-1] [:-3] [::-1] + ". py")

이것은 아마도 내가 얻을 수있는 최선일 것입니다. 나는 단지 나 자신을 잘못 증명했다.


0

파이썬 (2 & 3), 88 78 바이트

import os;os.rename(__file__,''.join(reversed(__file__.split(".")[0]))+".py"))

파일 이름이 sys.argv에 의해 제공된다는 사실 (작업 디렉토리는 파일이있는 폴더이므로)을 이용하고 os.rename을 사용합니다. 짜증나게도 reversed는 이터레이터를 반환하므로 join을 사용해야합니다.

편집 : @ muddyfish가 @DigitalTrauma에 제안한 것처럼 sys.argv [0] 대신 __file__을 사용하여 10 바이트를 절약했습니다.



0

비주얼 베이직 스크립트, 44 바이트

WScript.Echo(StrReverse(WScript.ScriptName))

reverse.vbs(cscript로 실행) 이라는 파일의 출력 예 :

sbv.esrever


0

SmileBASIC 60 바이트

P$=PRGNAME$()FOR I=1-LEN(P$)TO.Q$=Q$+P$[-I]NEXT
RENAME P$,Q$

대안 :

P$=PRGNAME$()T$=P$*1WHILE""<T$Q$=Q$+POP(T$)WEND
RENAME P$,Q$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.